Kendo Grid在第一个页面之后没有绑定任何页面上的数据

时间:2013-12-18 20:18:15

标签: c# asp.net-mvc asp.net-mvc-4 kendo-ui kendo-grid

我的* .cshtml页面上有一个带有服务器端分页的kendo网格。服务器端绑定的原因是只提取记录数量而不是一次提取所有数据。它将数据绑定到第一页并显示网格的正确数字页面,但当我转到任何其他页面时,除了一页之外,数据不会显示。

Page 1 and Page 2

.cshtml

@(Html.Kendo()
        .Grid<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(true)
            .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;
        return Json(result, JsonRequestBehavior.AllowGet);
    }

没有返回错误。我注意到在第一次绑定时设置了 DataSourceResult ,但是当你进行分页时它没有被设置。请参阅以下屏幕截图

enter image description here

浏览器是否可以缓存返回var模型的 EmployeeListResponse

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

问题是根据页码跳过结果,不是一次,而是两次。

假设您正在查询第二页:

  • 您的EmployeeListRequest运行查询,选择项目11-20

  • 方法ToDataSourceResult获取这10个项目,然后对它们运行过滤器。它选择这10个项目中的项目11-20,这样就不会产生任何项目。

您的解决方案是设置EmployeeListRequest,以便它不会在页面上进行过滤。允许它获取所有内容,然后让ToDataSourceResult进行过滤。

您可能想让EmployeeListRequest过滤页面,然后对其他所有内容进行ToDataSourceResult过滤。如果与任何其他过滤结合使用,则无效。假设您还过滤了“LastName ='Smith',并且有12名员工使用该姓氏。EmployeeListRequest将获得任何10名员工(不仅仅是'Smith'),然后ToDataSourceResult将仅对这10个项目应用“LastName”过滤器。您需要在进行分页之前应用列过滤。

答案 1 :(得分:1)

if (request.Page != 1)
     request.Page = 1;

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