剑道MVC网格创建动作" maxJsonLength超过"

时间:2016-02-24 04:09:22

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

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



v1.4.4




这是我的剑道MVC网格创建行动



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




其中[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对应的类,因此通过ASP.NET参数绑定机制,字段值会自动绑定。

一切都很好,直到文件太大,一旦Grid触发Create事件,它就会给我row

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



Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.




但它仍然失败。

有人可以告诉我为什么以及如何解决这个问题?

EDITED

我面临的问题不是如何返回大型JSON对象,而是如何将大型JSON对象发布到控制器。我正在将一些大的JSON对象(带有文件内容)发布到我的控制器,并且在 ... <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="2147483644"/> </webServices> </scripting> </system.web.extensions> ...的模型绑定步骤中,已经抛出了异常。

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

enter image description here

3 个答案:

答案 0 :(得分:1)

  

Kendo MVC Grid创建动作“maxJsonLength beyond”

你从控制器传回来的数据非常大,我看到你也在网页配置中设置了设置,但这对我来说没有用,我实际做的不是让Kendo转换我的对象进入Json我自己转换(我可以指定Json的最大长度),然后传递数据。这是代码。

创建一个C#扩展,它将您的Object转换为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行数据是没有用的。

答案 1 :(得分:0)

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

因此,您需要通过在数据库中分页来限制记录。 您将从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是您的实体模型

答案 2 :(得分:0)

好的,经过半天的Google冲浪,我终于到了这里:

Magic Solution

我仍然不知道它为什么工作(以及为什么ASP.NET MVC5的默认模型Binder不起作用),但在使用此JQuery扩展并调用博客后,JSON对象成功绑定到Controller参数。

希望它有所帮助。