C# Kendo Grid CustomEditor绑定导致maxJsonLength错误
我有一个剑道网格,它有绑定到相关表的列。网格显示了一个固定的4级层次结构,该层次结构是平展的:PK_字段、名称、级别_1、级别_2、级别_3和级别_4。C# Kendo Grid CustomEditor绑定导致maxJsonLength错误,c#,asp.net,asp.net-mvc,telerik,C#,Asp.net,Asp.net Mvc,Telerik,我有一个剑道网格,它有绑定到相关表的列。网格显示了一个固定的4级层次结构,该层次结构是平展的:PK_字段、名称、级别_1、级别_2、级别_3和级别_4。 我使用以下方法绑定级别列: 剑道格网: @(Html.Kendo().Grid<MyViewModel>() .Name("Grid") .Columns(columns => { columns.Command(command => { command.Edit
我使用以下方法绑定级别列: 剑道格网:
@(Html.Kendo().Grid<MyViewModel>()
.Name("Grid")
.Columns(columns =>
{
columns.Command(command =>
{
command.Edit();
command.Destroy();
}).Width(220);
columns.Bound(t => t.Name).Width(80);
columns.Bound(t => t.CreateDate).Width(80);
columns.ForeignKey(t => t.Level1Id, (System.Collections.IEnumerable)ViewData["Level1"], "Id", "Text").Title("Level 1").EditorTemplateName("EditLevel1Id");
columns.ForeignKey(t => t.Level2Id, (System.Collections.IEnumerable)ViewData["Level2"], "Id", "Text").Title("Level 2").EditorTemplateName("EditLevel2Id");
columns.ForeignKey(t => t.Level3Id, (System.Collections.IEnumerable)ViewData["Level3"], "Id", "Text").Title("Level 3").EditorTemplateName("EditLevel3Id");
columns.ForeignKey(t => t.Level4Id, (System.Collections.IEnumerable)ViewData["Level4"], "Id", "Text").Title("Level 4").EditorTemplateName("EditLevel4Id");
columns.Bound(t => t.Username).Width(100);
})
级别1到级别4的列都有自己的ViewData
变量
当级别_4使用的数据量变大时,会出现“字符串长度超过maxJsonLength属性上设置的值”错误
我的所有服务器端方法都设置为使用MaxJsonLength=Int32.MaxValue
,但ViewData变量不受此影响,因此当它们太大时会导致错误
如何防止大型ViewData变量产生错误
编辑
编辑模板-第一级:
@using Kendo.Mvc.UI
@(Html.Kendo().DropDownListFor(m => m)
.AutoBind(false)
.OptionLabel("Select a value...")
.DataTextField("Text")
.DataValueField("Id")
.DataSource(dataSource =>
{
dataSource.Read(read => read.Action("GetLevel1Descriptions", "MyAdmin").Data("filter1Descriptions"))
.ServerFiltering(true);
})
.HtmlAttributes(new { id = "Level1Id" })
)
@Html.ValidationMessageFor(m => m)
第2级:
@using Kendo.Mvc.UI
@(Html.Kendo().DropDownListFor(m => m)
.AutoBind(false)
.OptionLabel("Select a value...")
.DataTextField("Text")
.DataValueField("Id")
.DataSource(dataSource =>
{
dataSource.Read(read => read.Action("GetLevel2Descriptions", "Admin").Data("filterLevel2Descriptions"))
.ServerFiltering(true);
})
.CascadeFrom("Level1Id")
.HtmlAttributes(new { id = "Level2Id" })
)
@Html.ValidationMessageFor(m => m)
Level3和Level4遵循Level2模式以下是我为解决遇到maxJson长度问题所做的几件事: 1) Web.config更改:
<system.web>
<httpRuntime targetFramework="4.5" maxRequestLength="50000000" />
all other settings remove for Brevity.....
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
all other settings remove for Brevity.....
</system.webServer>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000" recursionLimit="500">
<converters></converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>
为简洁起见,删除所有其他设置。。。。。
为简洁起见,删除所有其他设置。。。。。
2) 使用以下三种变体返回JsonResult对象的自定义版本:
protected virtual JsonResult GetLargeJson<T>(List<T> model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
result = Json(model.ToDataSourceResult(request, ModelState));
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}
protected virtual JsonResult GetLargeJson(DataTable model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
if (!ModelState.IsValid)
{
DataSourceResult response = model.ToDataSourceResult(request);
response.Errors = ModelState.SerializeErrors();
result = Json(response);
}
else
{
result = Json(model.ToDataSourceResult(request));
}
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}
protected virtual JsonResult GetLargeJson<T>(T model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
result = Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}
protectedvirtualjsonresult GetLargeJson(列表模型,DataSourceRequest=null,bool-denyGet=true)
{
JsonResult=null;
if(请求==null)
{
结果=Json(模型);
}
其他的
{
result=Json(model.ToDataSourceResult(request,ModelState));
}
result.MaxJsonLength=Int32.MaxValue;
result.JsonRequestBehavior=(denyGet)?JsonRequestBehavior.denyGet:JsonRequestBehavior.AllowGet;
返回结果;
}
受保护的虚拟JsonResult GetLargeJson(DataTable模型,DataSourceRequest请求=null,bool denyGet=true)
{
JsonResult=null;
if(请求==null)
{
结果=Json(模型);
}
其他的
{
如果(!ModelState.IsValid)
{
DataSourceResult response=model.ToDataSourceResult(请求);
response.Errors=ModelState.SerializeErrors();
结果=Json(响应);
}
其他的
{
result=Json(model.ToDataSourceResult(request));
}
}
result.MaxJsonLength=Int32.MaxValue;
result.JsonRequestBehavior=(denyGet)?JsonRequestBehavior.denyGet:JsonRequestBehavior.AllowGet;
返回结果;
}
受保护的虚拟JsonResult GetLargeJson(T模型,DataSourceRequest请求=null,bool denyGet=true)
{
JsonResult=null;
if(请求==null)
{
结果=Json(模型);
}
其他的
{
result=Json(new[]{model}.ToDataSourceResult(request,ModelState));
}
result.MaxJsonLength=Int32.MaxValue;
result.JsonRequestBehavior=(denyGet)?JsonRequestBehavior.denyGet:JsonRequestBehavior.AllowGet;
返回结果;
}
其中,类型T
是一个泛型。这样,我就有了处理大型对象的标准方法,并确保它们不会爆发错误
我建议您寻找一种处理自定义编辑的替代方法,而不是启动
ViewData
对象中的所有内容,因为这将随着您的体验而变得异常庞大,如果数据用于下拉列表/多选类型控件,那么使用ajax版本的控件可能会产生更好的效果长期业绩。如果您能提供有关正在使用的编辑模板的更多详细信息,我很乐意为您提供一种执行此类操作的清理方法 @David_Shorthose:谢谢你的反馈。我已经实现了JsonResult重载和web.config设置,但是ViewData对象没有受到这些更改的影响?您确定抛出此错误的只是级别4列表吗?e、 这不是错误链中的另一个请求。我可以确认它是level4对象(一个包含大约30k条目的id和文本对的列表)。如果我减少Level4对象中的项目数量,就不会发生错误。我会认真地重新考虑将这些项目加载到视图数据中,因为30K的数据必须花费大量的时间来渲染。我还假设在这个阶段,基于模板,选项不可为空?我可能会建议远离外键绑定,使用普通绑定字段,这样就不必将值列表加载到下拉列表中。如果您愿意的话,我很高兴将此转换为聊天。谢谢。我通过[Column.Bound]绑定并更改网格使用的非常复杂的viewmodel来实现这一点。我会接受你的回答,因为你的评论提供了解决问题的途径!
protected virtual JsonResult GetLargeJson<T>(List<T> model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
result = Json(model.ToDataSourceResult(request, ModelState));
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}
protected virtual JsonResult GetLargeJson(DataTable model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
if (!ModelState.IsValid)
{
DataSourceResult response = model.ToDataSourceResult(request);
response.Errors = ModelState.SerializeErrors();
result = Json(response);
}
else
{
result = Json(model.ToDataSourceResult(request));
}
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}
protected virtual JsonResult GetLargeJson<T>(T model, DataSourceRequest request = null, bool denyGet = true)
{
JsonResult result = null;
if (request == null)
{
result = Json(model);
}
else
{
result = Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
result.MaxJsonLength = Int32.MaxValue;
result.JsonRequestBehavior = (denyGet) ? JsonRequestBehavior.DenyGet : JsonRequestBehavior.AllowGet;
return result;
}