我有一个只能一次加载完整视图的应用程序。我这样做的原因并不重要。重要的是,其余的内容只会在部分视图中回归。除了一些内容,我还有一些JSON对象,我希望在每次AJAX请求时来回传递服务器。
有没有办法以视图作为其属性之一返回JSON对象?这将是非常有用的并且可以节省带宽,因为我当前的解决方法是进行两次ajax调用,一次用于JSON,一次用于部分视图,这不仅需要更多时间和更多带宽,而且还需要两个单独的操作方法和服务器端的一些奇特的技巧。将视图序列化为JSON对象将解决我的所有问题。
实现这一目标的最佳方式是什么?这样做会有什么缺点(如果有的话)?
答案 0 :(得分:3)
您可以从控制器渲染视图,并使用JSON对象将其返回给客户端。
如果您使用我的简单helper to render ActionResult to a string,那么您的代码将如下所示:
public JsonResult DoSomething() {
var viewString = View().Capture(ControllerContext);
return new JsonResult {
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new {
time = DateTime.Now,
html = viewString
}
};
}
答案 1 :(得分:1)
这是一个有趣的代码似乎可以做我想要的,并保留我能说的模型绑定。
protected string RenderPartialViewToString(string viewName, object model)
{
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
像魅力一样工作。我只是使用它并将字符串作为JSON参数传递,然后在客户端上我读取参数并将其放入适当的容器中。我很高兴能有这个工作。