我的* .cshtml页面上有一个带有服务器端分页的kendo网格。服务器端绑定的原因是只提取记录数量而不是一次提取所有数据。它将数据绑定到第一页并显示网格的正确数字页面,但当我转到任何其他页面时,除了一页之外,数据不会显示。
.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 ,但是当你进行分页时它没有被设置。请参阅以下屏幕截图
浏览器是否可以缓存返回var模型的 EmployeeListResponse ?
非常感谢任何帮助。
答案 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);