我正在使用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>
...
的模型绑定步骤中,已经抛出了异常。
对控制器的请求如下所示:
答案 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冲浪,我终于到了这里:
我仍然不知道它为什么工作(以及为什么ASP.NET MVC5的默认模型Binder不起作用),但在使用此JQuery扩展并调用博客后,JSON对象成功绑定到Controller参数。
希望它有所帮助。