简体   繁体   English

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

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

I am writing a single page ajax app with ASP.NET MVC - making heavy use of jQuery. 我正在用ASP.NET MVC编写单页ajax应用程序 - 大量使用jQuery。 I do something similar to the following throughout the app: 我在整个应用程序中执行类似以下操作:

JS: JS:

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

Controller C#: 控制器C#:

public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{

    return PartialView("_CaseManager");
}

This works great. 这非常有效。 The viewHTML (in the ajax success function) is returned as a string and I can shove it on the page no problem. viewHTML (在ajax success函数中)作为字符串返回,我可以将它推到页面上没问题。

Now what I would like to do is to return not only the PartialView HTML string, but also some sort of status indicator. 现在我想做的是不仅返回PartialView HTML字符串,还返回某种状态指示器。 This is a permissions thing - for instance, if someone tries to get to a portion of they app they don't have permission to, I want to return a different PartialView than they asked for and also display a message in a popup window telling them why they got an View different from what they asked for. 这是权限的事情 - 例如,如果有人试图访问他们没有权限的应用程序的一部分,我想返回一个比他们要求的不同的PartialView,并在弹出窗口中显示一条消息告诉他们为什么他们有一个不同于他们所要求的观点。

So - to do this, I would like to do the following: 所以 - 要做到这一点,我想做以下事情:

Controller C#: 控制器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: 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); }
});

This SORTA works right now. 这个SORTA现在正常工作。 I get a good object in JavaScript (what I am expecting to see), however I cannot see how to get at the full HTML string of the jsReturnArgs.View property. 我在JavaScript中得到了一个好的对象(我期待看到的),但是我看不到如何获取jsReturnArgs.View属性的完整HTML字符串。

I am really just looking for the same string that would be returned if I were just returning the PartialView by itself. 我真的只是寻找相同的字符串,如果我只是自己返回PartialView

(As I mentioned at the beginning, this is a single page app - so I can't just redirect them to another View). (正如我在开头提到的,这是一个单页应用程序 - 所以我不能只将它们重定向到另一个视图)。

Thanks in advance for any help! 在此先感谢您的帮助!

So - using the following posts I got this working: 所以 - 使用以下帖子我得到了这个工作:

Partial Views vs. Json (or both) 部分视图与Json(或两者)

Render a view as a string 将视图渲染为字符串

They both lay it out nicely, then I changed my code to the following: 他们都很好地解决了,然后我将我的代码更改为以下内容:

C#: 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: 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); }
});

one way to skip having to return a json with multiple parameters and your html encoded as json is to send an HTML always but you send a hidden field that has the status set in it or something like that.. 跳过必须返回带有多个参数的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.");
  }
}

I wouldnt recommend this appraoch I would have two partial views one for the normal view and the other for the error/unauthorized case.. 我不推荐这个appraoch我会有两个部分视图一个用于普通视图,另一个用于错误/未经授权的情况..

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM