我有一個服務器操作標誌設置爲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:更新了我的答案。 –