53 votes

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

Je suis en train d'écrire une page unique application ajax avec ASP.NET MVC - faire de grosses utilisation de jQuery. Je fais quelque chose de semblable à la suivante tout au long de l'app:

JS:

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

Contrôleur De C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{

    return PartialView("_CaseManager");
}

Cela fonctionne très bien. L' viewHTML (en ajax success de la fonction) est retourné comme une chaîne et je peux pousser sur la page, pas de problème.

Maintenant ce que je voudrais faire est de retour, non seulement la PartialView HTML de la chaîne, mais aussi une sorte d'indicateur de l'état. C'est une des autorisations chose - par exemple, si quelqu'un essaie d'obtenir une part de leur application, ils n'ont pas l'autorisation, je veux revenir un autre PartialView qu'ils ont demandé et également d'afficher un message dans une fenêtre pop-up de leur dire pourquoi ils ont obtenu une Vue différente de ce qu'ils avaient demandé.

Donc - pour ce faire, je voudrais faire la chose suivante:

Contrôleur De 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); }
});

Cette SORTA fonctionne à l'heure actuelle. Je reçois un bon objet en JavaScript (ce que je m'attends à voir), mais je ne vois pas comment arriver à la pleine HTML chaîne de l' jsReturnArgs.View de la propriété.

Je suis vraiment à la recherche pour la même chaîne, qui serait retourné si je viens de revenir de l' PartialView par lui-même.

(Comme je l'ai mentionné au début, c'est une simple page app - donc je ne peux pas juste de les rediriger vers un autre point de Vue).

Merci d'avance pour toute aide!

47voto

MattW Points 3267

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); }
});
 

9voto

Baz1nga Points 10252

Une façon de ne pas avoir à renvoyer un json avec plusieurs paramètres et votre code html codé 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é.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X