2012-05-14 17 views
42

Piszę pojedynczą stronę ajax app z ASP.NET MVC - podejmowania intensywnego korzystania z jQuery. I zrobić coś podobnego do poniższego całej aplikacji:ASP.NET MVC - Przywracanie PartialView do Ajax wraz z innym obiektem

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

to działa świetnie. viewHTML (w funkcji ajax success) jest zwracany jako ciąg znaków i mogę go umieścić na stronie bez problemu.

Teraz chciałbym zwrócić nie tylko ciąg HTML PartialView, ale także jakiś wskaźnik statusu. To jest kwestia uprawnień - na przykład, jeśli ktoś próbuje dostać się do części aplikacji, do której nie ma uprawnień, chcę zwrócić inną PartialView niż poprosił, a także wyświetlić komunikat w wyskakującym okienku, informując o tym dlaczego dostali Widok inny od tego, o co prosili.

Tak - aby to zrobić, chciałbym wykonać następujące czynności:

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

Ten Sorta działa teraz. Dostaję dobry obiekt w JavaScript (czego się spodziewam), jednak nie widzę, jak uzyskać pełny ciąg HTML właściwości jsReturnArgs.View.

Naprawdę po prostu szukam tego samego ciągu znaków, który zostałby zwrócony, gdybym tylko sam zwrócił PartialView.

(Jak wspomniałem na początku, jest to aplikacja z jedną stroną - nie mogę po prostu przekierować ich do innego widoku).

Z góry dziękuję za pomoc!

Odpowiedz

40

Tak - przy użyciu następujących posty dostałem tej pracy:

Partial Views vs. Json (or both)

Render a view as a string

Obaj położyć ją ładnie, potem zmieniłem kod na następujący:

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

jeden sposób pominąć konieczności zwracania JSON z wieloma parametrami i html zakodowany jako json jest wysyłanie HTML zawsze jednak wyślesz ukryte pole, które ma status określony w niej czy coś takiego ..

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

Nie polecam tej aplikacji Mam dwa widoki częściowe jeden dla widoku normalnego, a drugi dla błędu/nieautoryzowanego przypadku ..

+0

Doceniam dane wejściowe! Próbowałem uniknąć czegoś takiego, gdybym mógł. – MattW

Powiązane problemy