Kendo Grid CustomEditor 绑定会导致 maxJsonLength 错误

本文关键字:maxJsonLength 错误 Grid CustomEditor 绑定 Kendo | 更新日期: 2023-09-27 18:20:21

我有一个剑道网格,其中列绑定到相关表。网格显示一个固定的 4 级层次结构,该层次结构已展平:PK_Field、名称、Level_1、Level_2、Level_3和Level_4。
我使用来自 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)

级别 3 和级别 4 遵循级别 2 模式

Kendo Grid CustomEditor 绑定会导致 maxJsonLength 错误

以下是我为解决maxJson长度被击中的问题所做的几件事:

1( 网页配置更改:

<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 版本的控件可能会导致更好的性能。如果您能提供有关您正在使用的编辑模板的更多详细信息,我很乐意帮助建议执行此类操作的清理方法。