31

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

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

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

谢谢!

4

4 回答 4

42

您还可以将 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
           };

在这种情况下,“this”是控制器,“ProductItemForm”是我的视图,“model”是我的 productItem 对象 :)

希望这可以帮助 ;)

于 2010-06-12T06:13:36.810 回答
1

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

在第二种情况下,采用两个或多个 ViewNames 并使用 RenderPartial 的共享 View 可能是通过 JSON 返回 HTML 的更好解决方案。

多视图.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 );
}
于 2009-07-25T13:33:20.970 回答
1

我一直在思考这个问题。我的解决方案类似于将部分视图 HTML 作为 JSON 字符串返回,但相反。返回嵌入了 JSON 的局部视图。在 jQuery 1.4.3 将他们的 .data() 方法与 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>

读取 JSON 的 JavaScript

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

这似乎违反了“单一责任原则”(如果您将其应用于视图)。但是,如果您的应用程序需要在响应中传输两条数据,那么我认为它没有任何问题。只要您的模型构建得当,它就不会违反任何设计原则。

于 2010-10-26T01:38:48.703 回答
0

这可能有点 hacky(我正在写我的头顶),但您可能想要创建自己的 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 中取出相关组件。

于 2009-07-25T11:41:19.043 回答