Asp.net mvc 作为JSON对象的一部分返回视图

Asp.net mvc 作为JSON对象的一部分返回视图,asp.net-mvc,ajax,json,jquery,Asp.net Mvc,Ajax,Json,Jquery,我有一个只加载一次完整视图的应用程序。我这样做的理由并不重要。重要的是,剩下的内容只会以部分视图的形式出现。除了一些内容之外,我还有一些JSON对象,我希望在每个AJAX请求中来回传递给服务器 有没有方法返回一个JSON对象,并将视图作为其属性之一?这将非常有用,并节省带宽,因为我目前的解决方法是进行两个ajax调用,一个用于JSON,一个用于部分视图,这不仅需要更多的时间和带宽,而且还需要两个单独的操作方法和服务器端的一些奇特技巧。将视图序列化为JSON对象可以解决我的所有问题 实现这一点的最

我有一个只加载一次完整视图的应用程序。我这样做的理由并不重要。重要的是,剩下的内容只会以部分视图的形式出现。除了一些内容之外,我还有一些JSON对象,我希望在每个AJAX请求中来回传递给服务器

有没有方法返回一个JSON对象,并将视图作为其属性之一?这将非常有用,并节省带宽,因为我目前的解决方法是进行两个ajax调用,一个用于JSON,一个用于部分视图,这不仅需要更多的时间和带宽,而且还需要两个单独的操作方法和服务器端的一些奇特技巧。将视图序列化为JSON对象可以解决我的所有问题


实现这一点的最佳方法是什么?这样做会有什么缺点(如果有的话)?

您可以从控制器渲染视图,并将其与JSON对象一起返回给客户端

如果您使用my simple,那么您的代码将如下所示:

public JsonResult DoSomething() {
    var viewString = View().Capture(ControllerContext);
    return new JsonResult {
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        Data = new {
            time = DateTime.Now,
            html = viewString
        }
    };
}

您可以从控制器呈现视图,并将其与JSON对象一起返回给客户端

如果您使用my simple,那么您的代码将如下所示:

public JsonResult DoSomething() {
    var viewString = View().Capture(ControllerContext);
    return new JsonResult {
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        Data = new {
            time = DateTime.Now,
            html = viewString
        }
    };
}

这里有一段有趣的代码,它似乎做了我想做的事情,并根据我所能说的保留了模型绑定

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参数传递,然后在客户机上读取参数并将其放入相应的容器中。我很高兴能让它工作。

这里有一段有趣的代码,它似乎做了我想做的事情,并保留了我所知道的模型绑定

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参数传递,然后在客户机上读取参数并将其放入相应的容器中。我很高兴这项工作能成功。

我想你可能误解了。我想在返回JsonResult的操作方法中包含asp.net MVC部分视图。据我所知,不能将ViewResult放入JsonResult。如何将视图转换为字符串并将其固定到jsonresult上?我已经更新了答案。它应该对你有用。我希望您能评价/分享我的博客文章,因为我专门回答了这个问题:)View()似乎没有一个称为Capture的方法。我找到了我需要的东西,并把它作为我自己问题的答案贴了出来。感谢您的帮助。
Capture
是一种扩展方法。只要看我贴的文章就行了。其实就是这么简单。@DmytriiNagirniak您的解决方案适用于所有ActionResult,并且该方法在许多情况下非常有用。投票!我想你可能误解了。我想在返回JsonResult的操作方法中包含asp.net MVC部分视图。据我所知,不能将ViewResult放入JsonResult。如何将视图转换为字符串并将其固定到jsonresult上?我已经更新了答案。它应该对你有用。我希望您能评价/分享我的博客文章,因为我专门回答了这个问题:)View()似乎没有一个称为Capture的方法。我找到了我需要的东西,并把它作为我自己问题的答案贴了出来。感谢您的帮助。
Capture
是一种扩展方法。只要看我贴的文章就行了。其实就是这么简单。@DmytriiNagirniak您的解决方案适用于所有ActionResult,并且该方法在许多情况下非常有用。投票!