2

我正在尝试根据所选日期从表中填充 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 });
    }
4

2 回答 2

3

看起来您返回的数据太多了。这里有两种可能的情况,它可能是一种或另一种或两者兼而有之。

(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<T>.ToGridModel(),您可以在Telerik.Web.Mvc.Extensions程序集中找到这些方法 (h/t: vladimir77 )。

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

于 2013-10-05T00:26:40.013 回答
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/

于 2014-05-15T11:10:21.307 回答