【问题标题】:ASP.NET MVC - Returning a PartialView to Ajax along with another objectASP.NET MVC - 将 PartialView 与另一个对象一起返回给 Ajax
【发布时间】:2012-05-14 19:24:52
【问题描述】:

我正在使用 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 函数中)作为字符串返回,我可以将它推到页面上没问题。

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

所以 - 为此,我想做以下事情:

控制器 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 会返回的相同字符串。

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

提前感谢您的帮助!

【问题讨论】:

    标签: javascript jquery asp.net-mvc-3


    【解决方案1】:

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

    Partial Views vs. Json (or both)

    Render a view as a string

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

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

    【讨论】:

      【解决方案2】:

      跳过返回带有多个参数的 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.");
        }
      }
      

      我不推荐这种方法我会有两个部分视图,一个用于正常视图,另一个用于错误/未经授权的情况..

      【讨论】:

      • 感谢您的意见!如果可以的话,我会尽量避免这样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多