【问题标题】:max json length error when populating telerik grid填充 Telerik 网格时出现最大 json 长度错误
【发布时间】:2013-10-03 18:03:13
【问题描述】:

我正在尝试根据所选日期从表格中填充 Telerik 网格。

我收到一条错误消息:

System.InvalidOperationException: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property

还有其他方法可以在客户端事件中填充 Telerik 网格吗?

查看:

        <%= Html.Telerik().DatePicker().Min("01/01/2011")
            .Name("Date")
            .ClientEvents(e => e.OnChange("Date_onChange"))
         %>       

    <div>
    <%= Html.Telerik().Grid<DataAccess.Entity.Dto.ReportData>()
            .Name("tblGrid")
            .DataBinding(databinding => databinding.Ajax()
            .Select("MasterDataGrid", "Report"))
            .Columns(col =>
                {
                    col.Bound(f => f.ID).Title("ID Number");
                    col.Bound(f => f.Date).Title("Date");
                })
                .Filterable(filter => filter.Enabled(true))
                .Pageable(page => page.PageSize(200))
                .Sortable(sort => sort.Enabled(true))                    
    %>
    </div>

JavaScript:

function Date_onChange() {

    var link = '/Report/DataGrid';
    var Date = $("#Date").val().toString();
    $.ajax({
        type: 'POST',
        url: link,
        data: { date: Date },
        dataType: 'json',
        success: function (result) {
            $("#tblGrid").data("tGrid").dataBind(result.data);
        },
        error: function (result) {
            $("#ErrorMessage").text(result.message);
        }
    });

};

控制器:

    [HttpPost]
    [GridAction]
    public ActionResult DataGrid(DateTime date)
    {
       var model = context.GetReportData_tblData(date);
        return View(new GridModel { Data = model });
    }

【问题讨论】:

    标签: asp.net-mvc json jquery telerik-grid


    【解决方案1】:

    您返回的数据似乎太多了。这里有两种可能的情况,可能是其中一种,也可能是两种。

    (1) 由于您的页面大小为 200,这意味着您需要大量数据,因此您可能会返回太多对象。默认情况下,Telerik Grid 将获取整个集合并在客户端进行排序和过滤。我会尝试实现服务器端分页和排序,以便一次只返回一页数据。

    查看:

    @(Html.Telerik.Grid<IEnumerable<MyClass>>()
      .Name("MyGrid")
      .Columns(col => // column definitions)
      .EnableCustomBinding(true)
      .Pageable(pg =>
        {
          paging.Total(Model.TotalCount);
          paging.PageSize(Model.PAGE_SIZE);
        })
      .DataBinding(db =>
        {
          db.Ajax().Select("DataGrid", "MyController");
        }
     )
    

    控制器:

    [GridAction(EnableCustomBinding = true)]
    public ActionResult DataGrid(GridCommand command, DateTime date)
    {
       MyModel model = new MyModel();
       IEnumerable<MyClass> data = context.GetReportData_tblData(date);
    
       // apply paging, filtering, grouping, and sorting
       GridModel gm = data.AsQueryable().ToGridModel(command.Page, command.PageSize, command.SortDescriptors, command.FilterDescriptors, command.GroupDescriptors);
    
       return View(gm);
    }
    

    Telerik 提供了一种方便的扩展方法来应用所有分页、排序、过滤和分组:IQueryable&lt;T&gt;.ToGridModel(),您可以在 Telerik.Web.Mvc.Extensions 程序集中找到它(h/t:vladimir77)。

    (2) 如果你的DataAccess.Entity.Dto.ReportData 类有很多属性,和/或它的一些属性有很长的字符串或子对象,它们也是递归序列化的,那么你可以很容易地用几个对象达到传输限制.我注意到您只在网格中使用了两个属性。请考虑创建仅包含您需要的数据的视图模型对象(无论如何这都是很好的做法)。

    【讨论】:

      【解决方案2】:

      您可以增加默认的 JavaScriptSerializer.MaxJsonLength。看看这个答案:https://stackoverflow.com/a/7207539/443379

      在此之后,过滤、分页...功能将不再起作用。您所要做的就是使用 CustomBinding(灵感来自 @howcheng 的回答):

      [GridAction(EnableCustomBinding=true)]
      public ActionResult DataGrid(GridCommand command, DateTime date)
      {
         var data = context.GetReportData_tblData(date)
           .ToGridModel(command.Page, command.PageSize, command.SortDescriptors, command.FilterDescriptors, command.GroupDescriptors);
      
         var serializer = new JavaScriptSerializer();
         var result = new ContentResult();
         serializer.MaxJsonLength = Int32.MaxValue; // overriding the default max length
         result.Content = serializer.Serialize(data);
         result.ContentType = "application/json";
         return result;
      }
      

      这甚至适用于客户端操作模式。您可以将其重构为一个类:http://macaalay.com/2011/09/27/large-json-result-for-teleriks-mvc-grid/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        相关资源
        最近更新 更多