ASP.NET MVC - 结合JSON结果用的ViewResult(ASP.NET MVC -

2019-06-17 15:30发布

我可以返回也包含了渲染视图一个JSON结果?

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

此外,当我需要返回一个JSON对象内从一个动作两个(或更多)查看结果,可以是有帮助的。

谢谢!

Answer 1:

您也可以呈现PartialViewResult为一个字符串,然后通过JSON传递这个字符串到您的视图,使用jQuery在页面渲染它。

你可以看到,在这个帖子: http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/ 。

我创建了一个扩展,使其更容易:

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

其中“这”的情况下,控制器,“ProductItemForm”是我的观点和“模式”是我productItem对象:)

希望这可以帮助 ;)



Answer 2:

在第一种情况下,我想你可以只返回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();
             }
});

在第二种情况下,一个共同看法是需要两个或更多的视图名,并使用的RenderPartial可能是一个更好的解决方案,通过JSON返回的HTML。

Multiview.aspx

 ...
<% foreach (string viewName in Model.Views)
   {
       Html.RenderPartial( viewName );
   }
%>

然后,在你的行动:

public ActionResult MyAction(...)
{
     ... set up model with data
     model.Views = new List<string> { "View1", "View2" };

     return View( "Multiview", model );
}


Answer 3:

我一直在思考这个问题了一会儿。 我的解决方案类似于返回局部视图HTML作为JSON字符串,但相反。 返回与JSON的局部视图嵌入其中。 我不喜欢这种做法,直到jQuery的1.4.3合并了。数据()方法与HTML 5的数据属性。 这使得它更容易产生一个ASP.NET MVC视图中JSON,并通过jQuery阅读。

见例子......它不是完美的,但我喜欢它比创建渲染返回之前的局部视图隐藏的表单输入或助手好得多。

部分观点:

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

JavaScript代码读取JSON

$(document).ready(function () {
  var name = $('#dataDiv').data('stuff').name;
  var color = $('#dataDiv').data('stuff').color;
  alert(name + ' ' + color);
});

这似乎违背了“单一职责原则”(如果你把它应用到视图)。 但是,如果你的应用需要在响应要发送的数据的两件的话,我看没有错。 只要您的模型正确构造,也不会违背任何设计原则。



Answer 4:

这可能是一个小哈克(和我写我的头顶部),但你可能想创建自己的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给客户端。

除了这一切,你可能想改变你的方法你如何做到这一点,例如。 你可以尝试返回从你的行动,其中的一部分是要返回,但该视图还包括一些额外的信息,否则将一直在你的JSON对象的完整视图(即HTML)。 您可以使用在客户端的简单的jQuery操作取出从返回的HTML相关组件。



文章来源: ASP.NET MVC - Combine Json result with ViewResult