ASP.NET MVC – 将PartialView与另一个对象一起返回到Ajax

我正在用ASP.NET MVC编写单页ajax应用程序 – 大量使用jQuery。 我在整个应用程序中执行类似以下的操作:

JS:

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

控制器C#:

 public ActionResult GetSomePartialView(SomeArgumentModel someArguments) { return PartialView("_CaseManager"); } 

这很好。 viewHTML (在ajax success函数中)作为string返回,我可以在页面上推它没有问题。

现在我想要做的是不仅返回PartialView HTMLstring,而且还返回某种状态指示器。 这是一个权限的事情 – 例如,如果有人试图去他们没有权限的应用程序的一部分,我想返回一个不同的PartialView比他们要求,并显示一个消息popup窗口告诉他们为什么他们得到一个不同于他们所要求的视图。

所以 – 要做到这一点,我想要做到以下几点:

控制器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); } }); 

SORTA现在工作。 我在JavaScript中获得了一个好的对象(我期望看到的),但是我看不到如何获取jsReturnArgs.View属性的完整HTMLstring。

我真的只是寻找相同的string,如果我只是自己返回PartialView将返回。

(正如我在开始提到的,这是一个单页的应用程序 – 所以我不能只redirect到另一个视图)。

提前感谢任何帮助!

所以 – 使用下面的post,我得到了这个工作:

部分视图与Json(或两者)

以stringforms呈现视图

他们都很好地布置,然后我改变了我的代码如下:

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

一种方法来跳过必须返回一个JSON与多个参数和您的HTML编码为JSON的是总是发送一个HTML,但你发送一个隐藏的领域,其中设置的状态或类似的东西..

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

我wouldnt推荐这个appraoch我会有两个部分意见之一的正常观点和其他错误/未经授权的情况下..