我正在使用jQuery的自动完成功能。当我试图检索超过17000条记录的列表(每个记录不会超过10个字符长度)时,它超过了长度并抛出错误:
异常信息: 异常类型:InvalidOperationException 异常消息:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性设置的值。
我可以在web.config中设置maxJsonLength的无限长度吗?如果不是,我可以设置的最大长度是多少?
我正在使用jQuery的自动完成功能。当我试图检索超过17000条记录的列表(每个记录不会超过10个字符长度)时,它超过了长度并抛出错误:
异常信息: 异常类型:InvalidOperationException 异常消息:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性设置的值。
我可以在web.config中设置maxJsonLength的无限长度吗?如果不是,我可以设置的最大长度是多少?
当前回答
如果你在视图中遇到这类问题,你可以使用下面的方法来解决。这里我用的是牛顿软包装。
@using Newtonsoft.Json
<script type="text/javascript">
var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>
其他回答
问题是你是否真的需要返回17k条记录?您打算如何处理浏览器中的所有数据?用户无论如何都不会滚动17000行。
更好的方法是只检索“前几条”记录,并根据需要加载更多记录。
似乎没有“无限”的价值。默认值是2097152个字符,相当于4 MB的Unicode字符串数据。
正如已经观察到的,在浏览器中很难很好地使用17000条记录。如果您正在呈现一个聚合视图,那么在服务器上进行聚合并在浏览器中只传输摘要可能会更有效。例如,考虑一个文件系统浏览器,我们只看到树的顶部,然后在向下钻取时发出进一步的请求。每个请求中返回的记录数量相对较少。树视图表示可以很好地用于大型结果集。
来点属性魔法怎么样?
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
// Default: 10 MB worth of one byte chars
private int maxLength = 10 * 1024 * 1024;
public int MaxLength
{
set
{
if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");
maxLength = value;
}
get { return maxLength; }
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
JsonResult json = filterContext.Result as JsonResult;
if (json != null)
{
if (maxLength == 0)
{
json.MaxJsonLength = int.MaxValue;
}
else
{
json.MaxJsonLength = maxLength;
}
}
}
}
然后,您可以使用全局过滤器配置或控制器/动作在全局中应用它。
对于那些有问题的MVC3 JSON自动反序列化的模型绑定和太大,这里有一个解决方案。
将JsonValueProviderFactory类的代码从MVC3源代码复制到一个新类中。 添加一行来更改对象反序列化之前的最大JSON长度。 用修改后的新类替换JsonValueProviderFactory类。
感谢http://blog.naver.com/techshare/100145191355和https://gist.github.com/DalSoft/1588818为我指明了正确的方向,如何做到这一点。第一个站点上的最后一个链接包含解决方案的完整源代码。
只需在MVC的动作方法中设置MaxJsonLength属性
JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;