0

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

.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);    
    } 

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

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

+0

По какой причине вы не хотите использовать подкачку Kendo? –

+0

Пейджинг кендо - это клиентская сторона, и когда данные возвращаются с серверной стороны, он возвращает только 10 записей, которые были необходимы для текущей страницы. Записи привязаны к сетке в качестве первых 10 записей, и когда вы нажимаете на любую другую страницу, кроме первой страницы, она не отображает никаких других записей. Именно по этой причине я не хочу использовать пейджинг кендо, поскольку я не возвращаю все данные в сетку и только данные, необходимые для текущей выбранной страницы. –

+0

Я не понимаю, почему вы пытаетесь это сделать: 'empList.PageNum = request.Page;' Там вы делаете много лишней работы, в основном сражаясь с тем, что Kendo делает для вас автоматически. Если вы заходите на страницу (через querystring), она вернет вам правильную страницу. –

ответ

1

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

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

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

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

+0

Привет @mmillican, я пробовал выше, но это вернет полный набор данных, и в текущей таблице, в которой я работаю, содержится более 1 миллиона записей. Разрешение серверу вытащить все эти записи для каждой страницы сервера или даже один раз при запуске вызовет значительную нагрузку на сервер. Вот почему я должен загружать только текущие данные страницы за раз. –

+0

@pchannon - тогда кажется, что с вашим EF что-то не так. Он должен отложить выполнение и только отменить результаты, необходимые для этой страницы. –

Смежные вопросы