我正在尝试根据所选日期从表中填充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 });
}
答案 0 :(得分:3)
看起来你回复的数据太多了。这里有两种可能的情况,它可能是一种或另一种或两种情况。
(1)由于您的页面大小为200,这意味着您需要大量数据,因此您可能会返回太多对象。默认情况下,Telerik Grid将采用整个集合并对客户端进行排序和过滤。我会尝试实现服务器端分页和排序,这样你一次只能返回1页数据。
查看:
@(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
类有很多属性,和/或它的一些属性有长字符串或子对象也是递归序列化的,那么你可以轻松地达到转移限制很少的物体。我注意到你只在Grid中使用了两个属性。请考虑创建仅包含所需数据的视图模型对象(无论如何这都是好的做法)。
答案 1 :(得分: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/