【问题标题】:Kendo MVC Grid Create action "maxJsonLength exceed"Kendo MVC Grid 创建动作“maxJsonLength 超过”
【发布时间】:2016-02-24 14:35:05
【问题描述】:

我正在使用 ASP.NET MVC5,并且我发布了一个具有以下格式的视图模型:

{
  row: {
      ...
      DocumentID: ...
      FileName: ...
      FileContent: .... //Very Very long base64 string
      ...
  }
}

这是我的 Kendo MVC Grid Create Action

[HttpPost]
public ActionResult Grid_Create([DataSourceRequest]DataSourceRequest request, MyViewModel row)
{
  // THE PROGRAM DID NOT EVEN STEP INTO THIS LINE
  try
  {
   ...
  }
  catch (Exception ex)
  {
    ModelState.AddModelError("ERROR", ex.Message);
  }
  return Json(...);
}

其中MyViewModel是一个对应row的类,通过ASP.NET参数绑定机制自动绑定字段值。

一切都很好,直到文件太大以至于一旦 Grid 触发 Create 事件,它就会给我Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

我在 web.config 中设置了最大 JSON 长度,如下所示:

 ...
<system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="2147483644"/>
      </webServices>
    </scripting>
  </system.web.extensions>  

...

但还是失败了。

谁能告诉我为什么以及如何解决这个问题?

已编辑

我面临的问题不是如何返回大型 JSON 对象,而是如何将大型 JSON 对象发布到控制器。我正在向我的控制器发布一些大型 JSON 对象(带有文件内容),并且在模型绑定到 MyViewModel 的步骤中,已经抛出异常。

对控制器的请求如下所示:

【问题讨论】:

  • 所以这里也正如我的回答所建议的那样,您需要覆盖默认的序列化和反序列化最大大小,所以如果它与 post 方法有关,那么您将不得不编写一个自定义模型绑定器,该绑定器在您的创建方法时命中接收到一些数据,在这个模型绑定器中,您可以编写逻辑以反序列化而不会出错,然后发送到控制器。

标签: c# json asp.net-mvc kendo-asp.net-mvc


【解决方案1】:

Kendo MVC Grid 创建动作“maxJsonLength 超过”

您从控制器传回的数据非常大,正如我所见,您也已将设置放入 Web 配置中,但这对我不起作用,我实际上所做的是而不是让 Kendo 转换我的对象转换成 Json 我自己转换(我可以指定 Json 的最大长度),然后传递数据。这是代码。

创建一个 C# 扩展,它将您的对象转换为 Json。

public static class JsonFormatter
{        
    public static string KendoJsonResult(this IEnumerable enumerable, DataSourceRequest request)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        serializer.MaxJsonLength = Int32.MaxValue; //Here change the default max size to Maximum possible value, that is Int32.MaxValue
        var jsonData = serializer.Serialize(enumerable.ToDataSourceResult(request));          

        return jsonData;           
    }

}

然后你可以改变你的代码,像这样将数据转换成 json。

return Content(dataset.KendoJsonResult(request), "application/json");

但仍然要确保您的数据在序列化为 Json 时不会太大,甚至不会溢出这个最大值。因为当用户甚至不会查看所有数据时,发送 1000 行数据是没有用的。

【讨论】:

  • 谢谢。您可能会在 OP 中看到我编辑的部分
【解决方案2】:

当您从服务器端获取大量记录时,您将面临此错误。

因此,您需要通过在数据库中对记录进行分页来限制记录。 您将从 Kendo UI Grid 获取当前偏移量和页面大小,并使用该页面偏移量和页面大小在数据库中设置分页。

 [HttpPost]

 public ActionResult Grid_Create([DataSourceRequest]DataSourceRequest request, MyViewModel row)
 {
   try
   {
     var dataset = dbsource.Skip(request.Page * request.PageSize).Take(request.PageSize).ToList();
   }
   catch (Exception ex)
   {
     ModelState.AddModelError("ERROR", ex.Message);
   }
   return Json(dataset);
 }

dbsource 是你的实体模型

【讨论】:

  • 谢谢,但我认为你误解了这个问题,它不是读取动作而是创建动作,我确实将一个大型 JSON 对象(我的 eg 中的行)发布到控制器,并且在步骤ASP.NET 模型绑定(尝试将 JSON 对象映射到 MyViewModel),它失败了。程序甚至不会执行到 try 块中。
【解决方案3】:

好吧,谷歌浏览了半天,终于到了:

Magic Solution

我仍然不知道它为什么起作用(以及为什么ASP.NET MVC5的默认Model Binder不起作用),但是在使用这个JQuery扩展后,并按照博客演示的方式调用,JSON对象成功绑定到Controller参数。

希望对你有帮助。

【讨论】:

  • 很高兴我在博客上发布的解决方案对您有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多