Asp.net mvc ASP.NET MVC-将Json结果与ViewResult相结合
我可以返回一个也包含渲染视图的Json结果吗 我需要它返回提交表单的新ID及其HTML和一些其他属性 当我需要从Json对象中的一个操作返回两个(或更多)视图结果时,这也会很有帮助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
谢谢 这可能有点老套(我正在写这篇文章),但您可能希望创建自己的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);
});