Asp.net mvc ASP.NET MVC-将Json结果与ViewResult相结合

Asp.net mvc ASP.NET MVC-将Json结果与ViewResult相结合,asp.net-mvc,json,partial-views,Asp.net Mvc,Json,Partial Views,我可以返回一个也包含渲染视图的Json结果吗 我需要它返回提交表单的新ID及其HTML和一些其他属性 当我需要从Json对象中的一个操作返回两个(或更多)视图结果时,这也会很有帮助 谢谢 这可能有点老套(我正在写这篇文章),但您可能希望创建自己的ActionResult子类,并实现一个ResultFilter,它将拦截这些特定类型的ActionResult,呈现相关视图,填充JsonResult并返回它 例如,您可以定义: public CompoundResult: ActionResult

我可以返回一个也包含渲染视图的Json结果吗

我需要它返回提交表单的新ID及其HTML和一些其他属性

当我需要从Json对象中的一个操作返回两个(或更多)视图结果时,这也会很有帮助


谢谢

这可能有点老套(我正在写这篇文章),但您可能希望创建自己的ActionResult子类,并实现一个ResultFilter,它将拦截这些特定类型的ActionResult,呈现相关视图,填充JsonResult并返回它

例如,您可以定义:

public CompoundResult: ActionResult
{
    public string ViewName { get; set; }
    public JsonResult JsonResult { get; set; }
    public CompoundResult(string viewName, JsonResult jsonResult)
    {
       ViewName = viewName;
       JsonResult = jsonResult;
    }
}
然后在ResultFilter中,呈现相关视图并将其合并到JsonResult中的相关位置,最后将JsonResult返回给客户端


除此之外,您可能还需要改变您的方法,例如,您可以尝试从您的操作返回完整视图(即HTML),其中一部分是您想要返回的视图,但其中还包含一些额外的信息,否则这些信息会出现在您的JSON对象中。您可以在客户端使用简单的jQuery操作从返回的HTML中取出相关组件。

在第一种情况下,我认为您可以只返回HTML,但可以将数据嵌入返回的表单中。使用jQuery访问成功回调中的数据

$.ajax({
    url: '<%= Url.Action( "MyAction" )',
    dataType: 'html',
    data: $('form').serialize(),
    success: function(data) {
                $('form').html(data);
                var id = $('form').find('input#formId[type=hidden]').val();
             }
});
$.ajax({

url:“您还可以将PartialViewResult呈现为字符串,然后通过JSON将该字符串传递给视图,并使用jQuery在页面中呈现该字符串

你可以在这篇文章中看到:

我创建了一个扩展以使其更简单:

public static class MvcHelpers
{
    public static string RenderPartialView(this Controller controller, string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = controller.ControllerContext.RouteData.GetRequiredString("action");

        controller.ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
            var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}
在我的控制器中,我将其称为:

const string msg = "Item succesfully updated!";
return new JsonResult
           {
               Data = new
                          {
                              success = true, 
                              message = msg,
                              view = this.RenderPartialView("ProductItemForm", model)
                          },
               JsonRequestBehavior = JsonRequestBehavior.AllowGet
           };
其中“this”是本例中的控制器,“ProductItemForm”是我的视图,“model”是我的productItem对象:)


希望这有帮助;)

我已经考虑了一段时间这个问题。我的解决方案类似于以JSON字符串形式返回部分视图HTML,但恰恰相反。返回一个嵌入JSON的部分视图。直到jQuery 1.4.3合并了它们的.data()之后,我才喜欢这种方法方法,这使得在ASP.NETMVC视图中生成JSON并通过jQuery读取变得更加容易

请参见示例…它并不完美,但我更喜欢它,而不是创建隐藏的表单输入或帮助程序,在返回部分视图之前渲染它

局部视图:

<div id="content">
  <h1>Some Title</h1>
  <p>Ipsum Lorem</p>
</div>
<div id="dataDiv" data-stuff='{ "name": "Jason", "color": "Blue"}'></div>

这似乎违背了“单一责任原则”(如果将其应用于视图)。但是,如果您的应用程序要求在响应中传输这两部分数据,那么我看不出有什么问题。只要您的模型构造正确,它就不会违反任何设计原则。

我喜欢这种方法。我将RenderPartialView添加到我的基本控制器类中,所以我经常这样做。您能解释更多关于结果过滤器?它正是我想要的;创建自定义ActionResult。。。
const string msg = "Item succesfully updated!";
return new JsonResult
           {
               Data = new
                          {
                              success = true, 
                              message = msg,
                              view = this.RenderPartialView("ProductItemForm", model)
                          },
               JsonRequestBehavior = JsonRequestBehavior.AllowGet
           };
<div id="content">
  <h1>Some Title</h1>
  <p>Ipsum Lorem</p>
</div>
<div id="dataDiv" data-stuff='{ "name": "Jason", "color": "Blue"}'></div>
$(document).ready(function () {
  var name = $('#dataDiv').data('stuff').name;
  var color = $('#dataDiv').data('stuff').color;
  alert(name + ' ' + color);
});