Установите индекс страницы сетки Kendo UI в контроллере MVC

Я пытаюсь установить индекс страницы для сетки кендо на контроллере, чтобы избежать подкачки на стороне клиента. При использовании подкачки на стороне клиента не отображаются никакие записи, кроме той, что на первой странице. При вызове данных из контроллера я возвращаю только 10 записей, которые необходимы для страницы. Вызов данных включает в себя функции Skip() и Take(), чтобы возвращать только необходимые данные с сервера, а не загружать всю сетку.

.cshtml

@(Html.Kendo().Grid<Reckon.Service.Payroll.Data.DTO.EmployeeDto>()
        .Name("EmployeeGrid")
        .Columns(cols => 
        {
                cols.Bound(emp => emp.Id).Title("ID").Hidden();
                cols.Bound(emp => emp.EmployeeNumber).Title("Employee ID").Width(100);
                cols.Bound(emp => emp.IsPayRunReady).Title("Status").Width(10).ClientTemplate("<span title='This employee is #= IsPayRunReady ? '': 'not '#payrun ready.' class='#= IsPayRunReady ? 'okICN-small' : 'alertICN-small'#'>#= IsPayRunReady ? '': 'Not' # #= IsPayRunReady ? 'P':'p'#ayrun ready</span>");
                cols.Bound(emp => emp.FirstName).Title("First Name").Width(100);
                cols.Bound(emp => emp.LastName).Title("Last Name").Width(100);
                cols.Bound(emp => emp.DateOfBirth).Title("DOB").Format("{0:dd/MM/yyyy}").Width(100);
                cols.Template(@<text></text>).ClientTemplate("<a href='" + Url.Action("EmployeeDetailEdit", "EmployeeDetail") + "/#=Id#'>Edit</a>").Width(50);
                cols.Template(@<text></text>).ClientTemplate("<a href='" + Url.Action("EmployeeDetailRead", "EmployeeDetailRead") + "/#=Id#'>View</a>").Width(50);
                cols.Template(@<text></text>).ClientTemplate("<a class='k-button xxx' tag='#=Id#'>Delete</a>").Width(50);
        })
            .Pageable(pageable => pageable.ButtonCount(5))
            .Sortable(sortable => sortable.AllowUnsort(false))
            .Filterable()
            .Resizable(resize => resize.Columns(true))
            .Reorderable(reorder => reorder.Columns(true))
            .Navigatable()
            .Events(evt => evt.DataBound("afterGridLoaded"))
            .DataSource(dataSource => dataSource
                                    .Ajax()
                                    .Batch(true)
                                    .PageSize(10)
                                    .ServerOperation(false)
                                    .Model(model =>
                                    {
                                        model.Id(emp => emp.Id);
                                    })
                                    .Read(read => read.Action("EmployeeListPerPage", "EmployeeDetail"))
                                   )
      )

.cs

public ActionResult EmployeeListPerPage([DataSourceRequest] DataSourceRequest request)
    {
        Dispose();
        EmployeeListRequest empList = new EmployeeListRequest();
        empList.PageNum = request.Page;
        empList.PageSize = request.PageSize;
        //empList.OrderBy = null; //request.Sorts.Any() ? "EmployeeNumber" : request.Sorts[0].Member;

        var dataSource = _payrollService.GetEmployeeListPerPage(empList);
        var model = new EmployeeListModel(dataSource);

        DataSourceResult result = model.Employees.ToDataSourceResult(request);
        result.Total = dataSource.Total;            

        // Set the Page index here

        return Json(result, JsonRequestBehavior.AllowGet);            
    }

При использовании пейджинга на стороне клиента он устанавливает возвращаемые данные на первую страницу, а затем выполняет пейджинг на стороне клиента, не возвращая результатов.

Возможно ли это сделать? Любая помощь будет принята с благодарностью.


person Peter Channon    schedule 22.12.2013    source источник
comment
По какой причине вы не хотите использовать пейджинг Кендо?   -  person Matt Millican    schedule 23.12.2013
comment
Пейджинг кендо выполняется на стороне клиента, и когда данные возвращаются со стороны сервера, возвращаются только 10 записей, необходимых для текущей страницы. Записи привязываются к сетке как первые 10 записей, и когда вы нажимаете на любую другую страницу, кроме первой, другие записи не отображаются. Вот почему я не хочу использовать подкачку кендо, поскольку я не возвращаю все данные в сетку, а только те данные, которые необходимы для текущей выбранной страницы.   -  person Peter Channon    schedule 23.12.2013
comment
Я не понимаю, почему вы пытаетесь это сделать: empList.PageNum = request.Page; Вы выполняете много дополнительной работы, по сути борясь с тем, что кендо делает за вас автоматически. Если вы посетите страницу (через строку запроса), она вернет вам нужную страницу.   -  person Matt Millican    schedule 23.12.2013
comment
Это, empList.PageNum = request.Page;, делается потому, что функция GetEmployeeListPerPage принимает только параметр EmployeeListRequest. Не могли бы вы привести пример?   -  person Peter Channon    schedule 23.12.2013
comment
Ваш метод GetEmployeeListPerPage() возвращает IQueryable<T> и используете ли вы Entity Framework или nHibernate? Все еще кажется, что ты пытаешься бороться с кендо. См. шаг 7 здесь: документы .kendoui.com/getting-started/using-kendo-with/aspnet-mvc/   -  person Matt Millican    schedule 23.12.2013
comment
Я использую структуру сущности. Вся цель состояла в том, чтобы использовать пейджинг на стороне сервера для сетки кендо и извлекать только необходимые данные для текущей страницы, а не всей сетки при загрузке.   -  person Peter Channon    schedule 23.12.2013


Ответы (1)


Поскольку вы используете Entity Framework, измените свой контроллер на это, чтобы Kendo/EF позаботился о пейджинге (это будет серверная сторона):

public ActionResult EmployeeList([DataSourceRequest] DataSourceRequest request)
{
    var employees = from emp in dbContext.Employees
                    select emp;

    return Json(employees.ToDataSourceResult(request), JsonRequestBehavior.
}

Это грубый пример, но он должен быть отправной точкой.

person Matt Millican    schedule 23.12.2013
comment
Привет, @mmillican, я пробовал вышеописанный способ раньше, но это вернуло бы полный набор данных, а текущая таблица, с которой я работаю, содержит более 1 миллиона записей. Разрешение серверу извлекать все эти записи для каждой страницы сервера или даже один раз в начале вызовет большую нагрузку на сервер. Вот почему я должен загружать только текущую информацию о странице за раз. - person Peter Channon; 24.12.2013
comment
@pchannon - похоже, что-то не так с вашим EF. Он должен отложить выполнение и получить только результаты, необходимые для этой страницы. - person Matt Millican; 24.12.2013