我有一个服务器操作标志设置为false的网格。我可以排序和网格上的列筛选(只现在我有一个):保留Kendo Grid状态
@(Html.Kendo().Grid<Models.ItemModel>()
.Name("Grid")
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
.Model(model =>
{
model.Id(r => r.Id);
model.Field(r => r.Name)
.Editable(false).DefaultValue("");
})
.Read(read => read
.Action("Grid_Read", "Home")
.Type(HttpVerbs.Get)))
.Columns(columns =>
{
columns.Bound(r => r.Id).Hidden();
columns.Bound(r => r.Name);
})
.Sortable()
.Filterable()
.Scrollable(scrollable => scrollable.Virtual(true))
.Resizable(resizable => resizable.Columns(true))
.AutoBind(false))
我的目标是确保如果重新加载页面的所有分类法,和的滤波被保留。为了达到这个目的,我通过存储在浏览器的localStorage中的JSON对象的形式获得一个网格状态。为了完成这个,我创建了两个javascript函数。一个保存状态:
function saveGridState(gridId) {
var grid = this.data("kendoGrid"),
dataSource = grid.dataSource,
state = {
columns: grid.columns,
page: dataSource.page(),
pageSize: dataSource.pageSize(),
sort: dataSource.sort(),
filter: dataSource.filter(),
group: dataSource.group()
},
json = JSON.stringify(state);
localStorage[gridId] = json;
}
,第二个检索它并应用到网格:
function loadGridState(gridId) {
var json = localStorage[gridId];
if (!json) { return; }
var grid = $('#'+gridId).data('kendoGrid'),
gridState = JSON.parse(json);
grid.dataSource.sort(gridState.sort);
grid.dataSource.filter(gridState.filter);
grid.dataSource.group(gridState.group);
grid.dataSource.page(gridState.page);
grid.dataSource.pageSize(gridState.pageSize);
}
在剃刀视图予加载的状态下,将其应用到电网并结合数据绑定每当排序或过滤发生变化时保存更新的事件。
<script>
loadGridState('grid');
$('#grid').data('kendoGrid').data('kendoGrid').dataSource.read();
$('#grid').data('kendoGrid').dataSource.bind('dataBound',function(){
saveGridState('grid');
});
</script>
该机制工作正常,除了一个小的不受欢迎的工件,我无法摆脱。也就是说,我注意到网格的Read操作总是被调用两次。第一次加载页面,第二次加载loadGridState。
我的想法是,由于服务器操作设置为false,应用分页,过滤和排序不应该执行AJAX调用。但它仍然如此。
任何建议将不胜感激。
我情况下,我想加载状态立即加载网格与网格d它的工作原理除了向服务器发送两个调用:一个在页面呈现后立即发生,第二次在状态被加载时发送。这是不可取的。我想要一个电话,所有的过滤器和分类已经到位。您提供的示例发送初始呼叫,然后在单击LoadState时发送第二个呼叫。我不想执行第二个调用,因为我的所有操作都设置在客户端。 – AstroSharp
@AstroSharp:更新了我的答案。 –