将视图渲染为字符串时超过MaxJsonLength

时间:2011-10-05 19:28:03

标签: asp.net-mvc json asp.net-mvc-3 model-view-controller serialization

好的,这么有趣的问题......

我通过this post将部分视图作为字符串返回。

这是我的基本控制器的样子:

public abstract class JsonController : Controller
  {
    protected string RenderPartialViewToString(string viewName, object model)
    {
      if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

      ViewData.Model = model;

      using (var sw = new StringWriter())
      {
        var viewEngineResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewEngineResult.View, ViewData, TempData, sw);
        viewEngineResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
      }
    }
  }

以下是它的使用方法:

ret = Json(RenderPartialViewToString("_ReportData", viewModel));

但是,现在该视图的结果太大了,我遇到了可怕的错误:

“字符串的长度超过maxJsonLength属性上设置的值”。

我不确定如何解决这个问题。显然,默认的JavaScriptSerializer不遵守web.config中的设置,因为很多文档都说明了这一点。

然而,尝试像LargeJsonResult类这样的自定义解决方案只会导致字符串序列化两次,这不是我需要的(并且肯定不起作用)。所以,我很茫然。当然必须有一种方法来处理这个,所以我可以将部分视图作为字符串返回,并指定maxJsonLength ...任何建议?

是的,我知道这里更大的问题是向客户发回太多数据;该问题将在未来得到解决。这是我现在需要解决的问题。谢谢。

更新 - 我的完整解决方案

谢谢谢尔盖,我得到了这个工作。如果其他人想要这样做,这是步骤。

首先要构建指定here的LargeJsonResult类。

然后我利用我的基本控制器类来调用RenderPartialViewToString,它可以找到here

接下来是代码:

var serializer = new JavaScriptSerializer();       serializer.MaxJsonLength = Int32.MaxValue;       var viewString = RenderPartialViewToString(“_ ReportData”,viewModel);

  ret = new LargeJsonResult()
          {
            Data = new
                     {
                       result = "Success",
                       html = viewString
                     }
          };

但仍有一个调整要做,那就是修复JQuery回调以获取返回的html部分。回调函数最初看起来像这样:

function GetReportComplete(response,status,xhr){        ...        $( '#报告')HTML(响应);

但它需要调整为这样:

function GetReportComplete(response,status,xhr){        ...        $( '#报告')的HTML($ parseJSON(响应)。html的。);

有了它,它有效。

1 个答案:

答案 0 :(得分:1)

在同样的情况下,这对我有用:

        var serializer = new JavaScriptSerializer();
        serializer.MaxJsonLength = Int32.MaxValue;

        return serializer.Serialize(...);

<强>更新

首先,我使用以下代码序列化部分视图:

    protected static String SerializeControl(string controlPath, object model)
    {
        var page = new ViewPage();
        var ctl = (ViewUserControl)page.LoadControl(controlPath);
        page.Controls.Add(ctl);
        page.ViewData.Model = model;
        page.ViewContext = new ViewContext();
        var writer = new StringWriter();
        System.Web.HttpContext.Current.Server.Execute(page, writer, false);
        var outputToReturn = writer.ToString();
        writer.Close();
        return outputToReturn.Trim();
    }

然后我使用我最初编写的代码将此字符串添加到JSON:

...
    var htmlsb = new StringBuilder();
...
    // listObj initialization here, doesn't matter for question
...
    htmlsb.Append(SerializeControl("~/Views/Shared/ListItem.ascx", listObj));

    var serializer = new JavaScriptSerializer();
    serializer.MaxJsonLength = Int32.MaxValue;

    return serializer.Serialize(new {result = "Success", html = htmlsb.ToString()});