Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Kendo Grid CustomEditor绑定导致maxJsonLength错误_C#_Asp.net_Asp.net Mvc_Telerik - Fatal编程技术网

C# Kendo Grid CustomEditor绑定导致maxJsonLength错误

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

我有一个剑道网格,它有绑定到相关表的列。网格显示了一个固定的4级层次结构,该层次结构是平展的:PK_字段、名称、级别_1、级别_2、级别_3和级别_4。
我使用以下方法绑定级别列:

剑道格网:

 @(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;


}