Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将视图呈现为字符串时超过MaxJsonLength_Asp.net Mvc_Json_Asp.net Mvc 3_Model View Controller_Serialization - Fatal编程技术网

Asp.net mvc 将视图呈现为字符串时超过MaxJsonLength

Asp.net mvc 将视图呈现为字符串时超过MaxJsonLength,asp.net-mvc,json,asp.net-mvc-3,model-view-controller,serialization,Asp.net Mvc,Json,Asp.net Mvc 3,Model View Controller,Serialization,好吧,这么有趣的问题 我将通过字符串返回部分视图 下面是我的基本控制器的外观: public abstract class JsonController : Controller { protected string RenderPartialViewToString(string viewName, object model) { if (string.IsNullOrEmpty(viewName)) viewName = ControllerC

好吧,这么有趣的问题

我将通过字符串返回部分视图

下面是我的基本控制器的外观:

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中的设置,因为很多文档都说明了这一点

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

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

更新-我的完整解决方案

多亏了谢尔盖,我才把这件事做好。如果其他人想这样做,以下是步骤

第一件事是构建指定的LargeJsonResult类

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

接下来是代码:

var serializer=新的JavaScriptSerializer(); serializer.MaxJsonLength=Int32.MaxValue; var viewString=RenderPartialViewToString(“_ReportData”,viewModel)

但是仍然需要做一个调整,那就是修复JQuery回调以提取返回的html部分。回调函数最初是这样的:

函数GetReportComplete(响应、状态、xhr){ ... $('#Report').html(回复)

但它需要调整成这样:

函数GetReportComplete(响应、状态、xhr){ ... $('#Report').html($.parseJSON(response.html)


有了它,它就起作用了。

在同样的情况下,这对我也起作用了:

        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()});

但是Sergey在哪里?如果没有上下文,这没有多大意义。部分视图已经被转换为字符串,作为JsonResult的一部分返回。再次序列化它会在结果周围加上引号,这不起作用。@Chris会回答代码-Sergey中的格式太糟糕了。您的解决方案g我可以使用RenderPartialViewToString方法、序列化程序代码和对JQuery回调方法的调整使其正常工作。
...
    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()});