ASP.NET MVC - 将 PartView 与另一个对象一起返回给 Ajax

ASP.NET MVC - Returning a PartialView to Ajax along with another object

本文关键字:一起 一个对象 返回 Ajax MVC NET PartView ASP      更新时间:2023-09-26

我正在编写一个带有 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 函数中(以字符串形式返回,我可以毫无问题地将其推到页面上。

现在我想做的是不仅返回 PartView HTML 字符串,还返回某种状态指示器。 这是一个权限问题 - 例如,如果有人试图访问他们没有权限的应用程序的一部分,我想返回与他们要求的不同 PartView,并在弹出窗口中显示一条消息,告诉他们为什么他们得到的视图与他们要求的视图不同。

所以 - 为此,我想执行以下操作:

控制器 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 属性的完整 HTML 字符串。

我真的只是在寻找如果我只是自己返回PartialView就会返回的相同字符串。

(正如我在开头提到的,这是一个单页应用程序 - 所以我不能将它们重定向到另一个视图(。

所以 - 使用以下帖子,我得到了这个工作:

部分视图与 Json(或两者兼而有之(

将视图呈现为字符串

他们都很好地布置了它,然后我将代码更改为以下内容:

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

我不推荐这个appraoch,我会有两个部分视图,一个用于普通视图,另一个用于错误/未经授权的情况。