web-dev-qa-db-fra.com

ASP.NET MVC - Retour d'un PartialView à Ajax avec un autre objet

J'écris une application ajax d'une seule page avec ASP.NET MVC - faisant un usage intensif de jQuery. Je fais quelque chose de similaire à ce qui suit dans l'application:

JS:

$.ajax({
    type: "GET",
    url: "/Home/GetSomePartialView/",
    data: someArguments,
    success: function (viewHTML) { 
        $("#someDiv").html(viewHTML); 
    },
    error: function (errorData) { onError(errorData); }
});

Contrôleur C #:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{

    return PartialView("_CaseManager");
}

Cela fonctionne très bien. Le viewHTML (dans la fonction ajax success) est renvoyé sous forme de chaîne et je peux le déplacer sur la page sans problème.

Maintenant, ce que je voudrais faire est de renvoyer non seulement la chaîne HTML PartialView, mais également une sorte d'indicateur d'état. Par exemple, si quelqu'un essaie d'accéder à une partie de son application pour laquelle il n'est pas autorisé, je souhaite renvoyer un PartialView différent de celui demandé et afficher un message dans une fenêtre contextuelle lui indiquant pourquoi ils ont une vue différente de ce qu'ils ont demandé.

Donc, pour ce faire, j'aimerais procéder comme suit:

Contrôleur C #:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{
    ReturnArgs r = new ReturnArgs();

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    {
        r.Status = 400; //good status ... proceed normally
        r.View = PartialView("_CaseManager");
    }
    else
    {
        r.Status = 300; //not good ... display permissions pop up
        r.View = PartialView("_DefaultView");
    }

    return Json(r);
}

public class ReturnArgs
{
    public ReturnArgs()
    {
    }

    public int Status { get; set; }
    public PartialViewResult View { get; set; }
}

JS:

$.ajax({
    type: "GET",
    url: "/Home/GetSomePartialView/",
    data: someArguments,
    success: function (jsReturnArgs) { 

        if (jsReturnArgs.Status === 300) { //300 is an arbitrary value I just made up right now
            showPopup("You do not have access to that.");
        }

        $("#someDiv").html(jsReturnArgs.View); //the HTML I returned from the controller
    },
    error: function (errorData) { onError(errorData); }
});

Ceci SORTA fonctionne maintenant. Je reçois un bon objet en JavaScript (ce que j'attends de voir), mais je ne vois pas comment obtenir la chaîne HTML complète du jsReturnArgs.View propriété.

Je cherche vraiment juste la même chaîne qui serait retournée si je retournais simplement le PartialView par lui-même.

(Comme je l'ai mentionné au début, il s'agit d'une application à une seule page - je ne peux donc pas simplement les rediriger vers une autre vue).

Merci d'avance pour votre aide!

45
MattW

Donc, en utilisant les posts suivants, j'ai obtenu que cela fonctionne:

Vues partielles contre Json (ou les deux)

Rendre une vue sous forme de chaîne

Ils ont tous les deux bien disposé, puis j'ai changé mon code comme suit:

C #:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{
    ReturnArgs r = new ReturnArgs();

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    {
        r.Status = 400; //good status ... proceed normally
        r.ViewString = this.RenderViewToString("_CaseManager");
    }
    else
    {
        r.Status = 300; //not good ... display permissions pop up
        r.ViewString = this.RenderViewToString("_DefaultView");
    }

    return Json(r);
}

public class ReturnArgs
{
    public ReturnArgs()
    {
    }

    public int Status { get; set; }
    public string ViewString { get; set; }
}

JS:

$.ajax({
    type: "GET",
    url: "/Home/GetSomePartialView/",
    data: someArguments,
    success: function (jsReturnArgs) { 

        if (jsReturnArgs.Status === 300) { //300 is an arbitrary value I just made up right now
            showPopup("You do not have access to that.");
        }

        $("#someDiv").html(jsReturnArgs.ViewString); //the HTML I returned from the controller
    },
    error: function (errorData) { onError(errorData); }
});
44
MattW

une façon de ne pas avoir à renvoyer un json avec plusieurs paramètres et votre code html encodé en json est d’envoyer un HTML toujours, mais vous envoyez un champ caché qui a le statut défini ou quelque chose comme ça.

success: function(data)
{
  if(data.find("#ajax-status").val()==="success")
  {
    $("#someDiv").html(data);
  }
  else
  {
    showPopup("You do not have access to that.");
  }
}

Je ne recommanderais pas cette approche, j'aurais deux vues partielles, l'une pour la vue normale et l'autre pour le cas d'erreur/non autorisé.

6
Baz1nga