我有一个Kendo Grid,其列已绑定到相关表。网格显示一个固定的4级层次结构,该层次结构被展平:PK_Field,Name,Level_1,Level_2,Level_3和Level_4。
我使用this examble from Telerik:
剑道网格:
@(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);
})
服务器端:
private void PopulateCategories()
{
var dataContext = new SampleEntities();
var categories = dataContext.Categories
.Select(c => new CategoryViewModel {
CategoryID = c.CategoryID,
CategoryName = c.CategoryName
})
.OrderBy(e => e.CategoryName);
ViewData["Level1"] = categories;
}
列Level_1到Level_4每个都有自己的ViewData
变量。
当Level_4使用的数据量变大时,会出现“字符串的长度超过maxJsonLength属性上设置的值”错误。
我的所有服务器端方法都设置为使用MaxJsonLength = Int32.MaxValue
,但ViewData变量不受此影响,因此当它们变得太大时会导致错误。
如何防止大型ViewData变量产生错误?
修改
编辑模板 -
1级:
@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模式
答案 0 :(得分:1)
我采取了以下几项措施来解决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;
}
type T
是通用的。通过这种方式,我有一种处理大型对象的标准方法,并确保它们不会出错。
我建议可能会考虑另一种处理自定义编辑的方法,而不是启动ViewData
对象中的所有内容,因为当您遇到这种情况并且数据被用于下拉/多选时,它会变得特别大类型控件然后使用控件的ajax版本可能会导致长期更好的性能。如果您可以提供有关正在使用的编辑模板的更多详细信息,我很乐意帮助建议执行此类操作的清理方法。