2012-05-14 9 views
42

Ich schreibe eine einzelne Seite Ajax-App mit ASP.NET MVC - Verwendung von jQuery. Ich tue etwas ähnlich der folgenden in der gesamten App:ASP.NET MVC - Zurückgeben einer PartialView zu Ajax zusammen mit einem anderen Objekt

JS:

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

-Controller C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 

    return PartialView("_CaseManager"); 
} 

Dies funktioniert gut. Die viewHTML (in der Ajax success Funktion) wird als String zurückgegeben und ich kann es auf der Seite schieben kein Problem.

Jetzt möchte ich nicht nur die PartialView HTML-Zeichenfolge, sondern auch eine Art Statusanzeige zurückgeben. Dies ist eine Erlaubnis Sache - zum Beispiel, wenn jemand versucht, zu einem Teil der sie App, die sie nicht haben, zu bekommen, möchte ich eine andere PartialView zurückgeben, als sie gefragt und auch eine Nachricht in einem Popup-Fenster zeigen ihnen angezeigt Warum haben sie eine andere Aussicht bekommen als sie gefragt haben?

Also -, dies zu tun, würde Ich mag folgendes tun:

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

Diese SORTA funktioniert jetzt. Ich bekomme ein gutes Objekt in JavaScript (was ich zu sehen erwarte), aber ich kann nicht sehen, wie man die vollständige HTML-Zeichenfolge der jsReturnArgs.View-Eigenschaft erhält.

Ich bin wirklich nur auf der Suche nach der gleichen Zeichenfolge, die zurückgegeben würde, wenn ich nur die PartialView von selbst zurückgeben würde.

(Wie ich am Anfang erwähnt habe, ist dies eine einzelne Seite App - so kann ich nicht einfach zu einer anderen Ansicht umleiten).

Vielen Dank im Voraus für jede Hilfe!

Antwort

40

So - mit den folgenden Beiträge, die ich diese Arbeit bekam:

Partial Views vs. Json (or both)

Render a view as a string

Sie beide es schön auslegen, dann änderte ich meinen Code auf die folgenden:

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

ein Weg zu überspringen eine json mit mehreren Parametern zurückkehren zu müssen und Ihre HTML codierte als json ist immer eine HTML zu senden, aber Sie ein verstecktes Feld schicken, die den Status in ihm oder so etwas gesetzt hat ..

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

Ich würde diese appraoch nicht empfehlen Ich hätte zwei Teilansichten für die normale Ansicht und die andere für den Fehler/nicht autorisierten Fall ..

+0

Ich schätze den Eingang! Ich habe versucht, so etwas zu vermeiden, wenn ich könnte. – MattW

Verwandte Themen