У меня есть сетка с флагом операций сервера, установленным в false. Можно сортировать и фильтровать по столбцам (теперь у меня есть только один) из сетки:Сохранение состояния сетки Kendo
@(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))
Моя цель состоит в том, чтобы убедиться, что все и фильтраций сортировки сохраняются при перезагрузке страницы. Для этого я получаю состояние сетки в виде объекта 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);
}
В представлении бритвы загружает состояние, применить его к сетке и связать DataBound событие для сохранения обновленного, если вся сортировка или фильтрация изменились.
<script>
loadGridState('grid');
$('#grid').data('kendoGrid').data('kendoGrid').dataSource.read();
$('#grid').data('kendoGrid').dataSource.bind('dataBound',function(){
saveGridState('grid');
});
</script>
Механизм работает отлично, за исключением одного небольшого нежелательного артефакта в поведении, что я не могу избавиться от. А именно, я замечаю, что действие Read в сетке всегда вызывается дважды. Первый раз, когда страница загружается, и второй раз, когда я вызываю loadGridState.
Мое мышление было, так как операции сервера, установленные на false, применяя пейджинг, фильтрацию и сортировку, не должны выполнять вызов AJAX. Но это так и есть.
Любые предложения были бы весьма полезными.
в моем case, я хотел бы загрузить состояние сразу после загрузки страницы с помощью сетки d он работает, за исключением того, что отправляет два вызова на сервер: один сразу после визуализации страницы и второй раз при загрузке состояния. Это нежелательно. Мне нужен один звонок, и все фильтры и сортировка уже на месте. Пример, который вы предложили, отправляет первоначальный вызов, а затем второй вызов, когда я нажимаю LoadState. Я не хочу выполнять второй вызов, так как все мои операции установлены на стороне клиента. – AstroSharp
@AstroSharp: Обновлен мой ответ. –