每当用户更改网格上的分页时,我都会将设置保存在localStorage中,并在用户再次导航到页面时检索它以将其重新设置。要检索它,我使用了dataSource的pageSize属性,在该属性中我传递了一个IIF,如下所示:
pageSize: function () {
var pageSize = 10;
if (window.localStorage) {
var userPreferencePageSize = localStorage.getItem("somegridPageSize");
if (userPreferencePageSize === parseInt(userPreferencePageSize)) {
userPreferencePageSize = parseInt(userPreferencePageSize);
}
if (!isNaN(userPreferencePageSize)) {
pageSize = userPreferencePageSize;
}
}
return pageSize;
}()
这很好用,但是用户要求将pageSize设置为“ All”。 Kendo在Grid中处理“ All”,因此我认为这也可以让我将dataSource pageSize设置为字符串“ All”(pageSize =“ All”)。但是,当我这样做时,网格开始显示X记录的NaN并显示一个空网格。所以问题是..如何将dataSource的pageSize预设为“全部”?
注意:一种替代方法是只获取网格的最大总数,然后用jquery text(“ All)替换下拉列表中显示的数字,但这看起来像是hack,在我看来,这应该已经内置到了框架,但我在文档中找不到任何内容。
编辑:这变得更加有趣。由于缺少其他选项,因此像注释中一样实现了它,只需直接设置dataSource pageSize即可:
$("#Grid").data("kendoGrid").dataSource.pageSize(pageSize);
但这会导致网格上的筛选器发生故障,并从端点引发“字符串格式不正确”(误导性错误)错误。经过足够的研究,我发现它是由DataSourceRequest在后台执行一些无法识别的shuru buru引起的。由于设置dataSource pageSize会导致问题,因此我尝试仅以编程方式设置下拉菜单,然后让kendo触发更新pageSize本身的请求,如下所示:
var selectBox = $(".k-pager-sizes").find("select");
selectBox.val(pageSize);
selectBox.find("option[value='" + pageSize + "']").prop('selected', true);
但是网格不允许我这样做,并且会继续从javascript还原我在DOM内部所做的任何更改。
问题是,到底如何从javascript更改服务器端kendo网格的pageSize(触发对端点的额外请求)。
答案 0 :(得分:0)
回答问题。这似乎是剑道中的错误。在绑定数据源之后将pageSize设置为0(“ all”的快捷方式)将始终导致网格在工具栏模板内声明的任何自定义过滤器存在问题。
确切地说,如果您在工具栏模板内定义了自定义过滤器:
@(Html.Kendo().TextBox().Name("Filter").Deferred())
您可以通过网格上的dataSource定义将其连接起来,例如:
.DataSource(ds =>
ds.Ajax()
.PageSize(defaultPageSize)
.Read(a => a.Action(actionName, controllerName, new
{
param = Model.param
}).Data("getFilterParameters")))
在JavaScript中获取类似的参数:
getFilterParameters: function () {
return this.filterParameters;
},
使用一种方法填充它们:
filter: function () {
var grid = $("#Grid").data("kendoGrid");
this.filterParameters = {
param: $("#Filter").val()
};
grid.dataSource.page(1);
}
具有连接到其的简单事件侦听器:
$("#Filter").on("keyup", filter);
然后使用以下方法将pageSize编程更改为0 /“ all”:
$("#Grid").data("kendoGrid").dataSource.pageSize(0);
过滤器将开始始终返回NaN作为带有查询参数传递给服务器的过滤器对象的当前页面/跳过(即使网格将正确显示数字)。每当您尝试使用过滤器时,这将在端点上的框架代码内导致“字符串格式不正确”异常。上面的解决方案是稍微修改getFilterParameters方法:
getFilterParameters: function (e) {
// Workaround for Kendo NaN pager values if pageSize is set to All
if (isNaN(e.page)) e.page = 1;
if (isNaN(e.skip)) e.skip = 0;
//
return this.filterParameters;
}
这将重新初始化页面,并在提交过滤器请求之前跳过值。无论如何,这些值将使用正确的值重新填充到端点上。不是我注意到了,而是另一个从事该项目的开发人员,功劳归功于她。