KendoUI MVC 网格不显示除第一页以外的页面数据
KendoUI MVC grid doesn't show data for pages except first page
我有一个 KendoUI MVC 网格如下:
@(Html.Kendo().Grid<MonitoringVm>()
.Name("monitoringGrid")
.Columns(columns =>
{
columns.Bound(c => c.RecordDateTime).Title("Date Time").Format("{0:dd/MM/yyyy hh:mmtt}").Width(149);
columns.Bound(c => c.SourceEndpointName).Title("Source").Width(100).Sortable(true);
columns.Bound(c => c.DestinationEndpointName).Title("Destination").Width(100);
columns.Bound(c => c.TagName).Title("Tag").Width(120);
columns.Bound(c => c.ErrorDescription).Title("Description");
columns.Bound(c => c.LogTransferErrorId).Title("Retry")
.ClientTemplate("<div style='text-align: center;'><button class='k-button k-primary' type='button' onclick=\"javascript: retryRequest(this);\">Retry</button></div>")
.HeaderTemplate("<div style='text-align: center;'>Retry</div>")
.Width(50);
columns.Bound(c => c.LogTransferErrorId).Title("Delete")
.ClientTemplate("<div style='text-align: center;'><img src='/Content/Images/iconfinder_bin.png' onclick=\"javascript: confirmArchiveError('#:data.LogTransferErrorId#');\" class='archive-error'/></div>")
.HeaderTemplate("<div style='text-align: center;'>Delete</div>")
.Width(50);
}
)
.Pageable()
.Sortable(sortable => sortable.AllowUnsort(true))
.ClientDetailTemplateId("template")
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(25)
.ServerOperation(true)
.Read(read => read.Action("ReadErrorRecords", "Monitoring"))
)
.Events(events => events.DataBound("dataBound")))
对应控制器如下:
private readonly JsonHttpClient _client;
public JsonResult ReadErrorRecords([DataSourceRequest]DataSourceRequest request)
{
var urlEndpoint = $"Monitor/ErrorRecords?page={request.Page}&pageSize={request.PageSize}";
var response = _client.Get<MonitoringVmResponse>(urlEndpoint);
DataSourceResult result = response.Results.ToDataSourceResult(request);
result.Total = response.Count ?? 0;
return Json(result);
}
当我导航到不同的页面时,会调用上面的控制器方法。在调试器中,我观察到我收到了正确的数据并且从控制器返回了相同的数据。
在UI上,第一页之后的后续页面不显示数据。
我错过了什么?
你好像做了两次分页。
假设您发出了对第二页的请求。
我想你的 _client.Get<MonitoringVmResponse>(urlEndpoint)
会 return 记录 26 到 50。
但稍后您调用 response.Results.ToDataSourceResult(request)
,它也在内部应用 .Skip(25)
和 .Take(25)
,因此将跳过上一次调用的所有项目,并且不会 returned 到你的看法。
我想有两种可能的解决方法:
- 可以使用其他 Kendo 扩展方法代替
.ToDataSourceResult(request)
,例如 GroupBy
、OrderBy
、Where
等
- 可以通过提供值 1 作为
request.Page
来 "fool" .ToDataSourceResult(request)
方法:
var response = _client.Get<MonitoringVmResponse>(urlEndpoint);
request.Page = 1;
DataSourceResult result = response.Results.ToDataSourceResult(request);
我有一个 KendoUI MVC 网格如下:
@(Html.Kendo().Grid<MonitoringVm>()
.Name("monitoringGrid")
.Columns(columns =>
{
columns.Bound(c => c.RecordDateTime).Title("Date Time").Format("{0:dd/MM/yyyy hh:mmtt}").Width(149);
columns.Bound(c => c.SourceEndpointName).Title("Source").Width(100).Sortable(true);
columns.Bound(c => c.DestinationEndpointName).Title("Destination").Width(100);
columns.Bound(c => c.TagName).Title("Tag").Width(120);
columns.Bound(c => c.ErrorDescription).Title("Description");
columns.Bound(c => c.LogTransferErrorId).Title("Retry")
.ClientTemplate("<div style='text-align: center;'><button class='k-button k-primary' type='button' onclick=\"javascript: retryRequest(this);\">Retry</button></div>")
.HeaderTemplate("<div style='text-align: center;'>Retry</div>")
.Width(50);
columns.Bound(c => c.LogTransferErrorId).Title("Delete")
.ClientTemplate("<div style='text-align: center;'><img src='/Content/Images/iconfinder_bin.png' onclick=\"javascript: confirmArchiveError('#:data.LogTransferErrorId#');\" class='archive-error'/></div>")
.HeaderTemplate("<div style='text-align: center;'>Delete</div>")
.Width(50);
}
)
.Pageable()
.Sortable(sortable => sortable.AllowUnsort(true))
.ClientDetailTemplateId("template")
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(25)
.ServerOperation(true)
.Read(read => read.Action("ReadErrorRecords", "Monitoring"))
)
.Events(events => events.DataBound("dataBound")))
对应控制器如下:
private readonly JsonHttpClient _client;
public JsonResult ReadErrorRecords([DataSourceRequest]DataSourceRequest request)
{
var urlEndpoint = $"Monitor/ErrorRecords?page={request.Page}&pageSize={request.PageSize}";
var response = _client.Get<MonitoringVmResponse>(urlEndpoint);
DataSourceResult result = response.Results.ToDataSourceResult(request);
result.Total = response.Count ?? 0;
return Json(result);
}
当我导航到不同的页面时,会调用上面的控制器方法。在调试器中,我观察到我收到了正确的数据并且从控制器返回了相同的数据。
在UI上,第一页之后的后续页面不显示数据。 我错过了什么?
你好像做了两次分页。
假设您发出了对第二页的请求。
我想你的 _client.Get<MonitoringVmResponse>(urlEndpoint)
会 return 记录 26 到 50。
但稍后您调用 response.Results.ToDataSourceResult(request)
,它也在内部应用 .Skip(25)
和 .Take(25)
,因此将跳过上一次调用的所有项目,并且不会 returned 到你的看法。
我想有两种可能的解决方法:
- 可以使用其他 Kendo 扩展方法代替
.ToDataSourceResult(request)
,例如GroupBy
、OrderBy
、Where
等 - 可以通过提供值 1 作为
request.Page
来 "fool".ToDataSourceResult(request)
方法:
var response = _client.Get<MonitoringVmResponse>(urlEndpoint);
request.Page = 1;
DataSourceResult result = response.Results.ToDataSourceResult(request);