Kendo UI 网格,将页面设置为 1,没有双重回发
Kendo UI Grid, setting page to 1 without double postback
我在页面上有以下代码。
问题是,当单击 "MainSearchSubmit" 按钮时,方法 "RefreshGrid()" 导致对服务器进行 2 次后续 ajax 调用。我发现这是因为对 "datasource.read()" 和 "datasource.page(1)" 的调用都回发到服务器(它们都在 运行ning 数据源的 read() 方法)。
我仍然需要在点击搜索按钮时将网格页面设置为 1,否则有人可以在第 3 页,然后点击搜索按钮,获取更新的结果,但仍然在第 3 页。他们需要单击搜索按钮时将重置为第 1 页。
我还需要运行 read(),否则更新的参数不会被传递,数据也不会被刷新。
我找到了类似的帖子,其中一些人建议使用 .query() 方法。我试过了(代码在 "RefreshGrid()" 方法中被注释掉了),但这也导致了 2 个帖子到服务器。
关于如何解决这个问题的任何想法?
代码:
<script>
$(document).ready(InitializeNDCMapping);
function InitializeMainMapping() {
$("#MainSearchSubmit").click(function (e) {
RefreshGrid();
e.preventDefault();
});
}
function RefreshGrid() {
$("#MainListGrid").data("kendoGrid").dataSource.read();
$("#MainListGrid").data("kendoGrid").dataSource.page(1);
//Defunct code
//var dataSource1 = $("#NDCListGrid").data("kendoGrid").dataSource;
//dataSource.query({
// read: dataSource1.read(),
// page: dataSource1.Page(1),
// pagesize: dataSource1.PageSize(25)
//});
}
</script>
<div class="search-buttons">
<input type="submit" value="Search" id="MainSearchSubmit" />
<input type="button" value="Reset" onclick="ResetMainSearch()" />
</div>
<div>
@(Html.Kendo().Grid<BackOffice.ViewModels.NDCItem>()
.Name("MainListGrid")
.Filterable()
.Pageable(p => p.PageSizes(new int[] { 25, 50, 100 }).Input(true)
.Messages(m=>m.Empty("No Main-Ingredient found")).Numeric(false))
.Sortable()
.Navigatable()
.Selectable(selectable => selectable.Mode(GridSelectionMode.Single))
.Columns(columns =>
{
columns.Bound(l => l.NDCCode).Title("NDC Code").Width("5%")
.ClientTemplate(@Html.DialogFormLink("#=NDCCode#", Url.Action("NDCMappingEdit", new { NDCCode = "#=NDCCode#", mainMultumDrugCode = "#=MainMultumDrugCode#", drugId = "#=DrugId#", isMapped = "#=IsMapped#" }), "NDC Mapping", "", "", "NDCDialogLink", "1100", "600", "").ToHtmlString());
columns.Bound(l => l.Name).Title("Generic Name").Width("15%");
columns.Bound(l => l.MainCode).Hidden();
columns.Bound(l => l.MainId).Hidden();
columns.Bound(l => l.MainDescription).Title("Main Description").Width("15%");
columns.Bound(l => l.MainIngredientCode).Hidden();
columns.Bound(l => l.MainIngredient).Title("Main Ingredient").Width("15%");
columns.Bound(l => l.MainNumAmount).Title("Main Qty").Width("5%");
columns.Bound(l => l.MainNum).Title("Main Unit").Width("5%");
columns.Bound(l => l.MainDenomAmount).Title("Main Denom").Width("5%");
columns.Bound(l => l.MainDenom).Title("Main Denom Unit").Width("5%");
columns.Bound(l => l.IsMapped).Title("Mapped").Width("5%").Filterable(false).Sortable(false)
.ClientTemplate("<input type='checkbox' name='selected_#=MainCode#' class='chkbx select'" + "#= IsMapped ? 'checked' : ''#" + " />")
.HtmlAttributes(new { @class = "center", @onclick = "return false" })
.HeaderHtmlAttributes(new { @class = "center" });
})
.AutoBind(false)
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(false)
.Read(read => read.Action("MainList_Read", "Drug").Data("getRouteParams"))
.Model(model =>
{
model.Field(f => f.MainCode).Editable(false);
model.Field(f => f.MainName).Editable(false);
model.Field(f => f.MainDCCode).Editable(false);
model.Field(f => f.MainId).Editable(false);
model.Field(f => f.MainDescription).Editable(false);
model.Field(f => f.MainIngredientCode).Editable(false);
model.Field(f => f.MainIngredient).Editable(false);
model.Field(f => f.MainNumAmount).Editable(false);
model.Field(f => f.MainNum).Editable(false);
model.Field(f => f.MainDenomAmount).Editable(false);
model.Field(f => f.MainDenom).Editable(false);
model.Field(f => f.IsMapped).Editable(false);
})
.PageSize(25)
.Events(events => events.Error("MainRead_Error"))
)
)
</div>
以前遇到类似问题,几乎都是因为click handler被注册了两次,即使用户点击了一次button,handler却执行了两次。
你在哪里调用InitializeMainMapping()?另外,我不确定这是否是复制和粘贴错误,但 InitializeMainMapping() 缺少结束符 }。当用户单击按钮时,您是否收到任何 javascript 错误?
只是一些帮助您入门的想法。
我找到了解决方案。如果页面已设置为 1 并且您 运行...
grid.dataSource.page(1);
这导致读取。否则,如果页面尚未设置为 1 并且您 运行 上面的代码不会导致读取。所以问题的解决方案如下。
if (grid.dataSource.page() != 1) {
grid.dataSource.page(1);
}
grid.dataSource.read( {parameter: "value"} );
在这里找到了这个解决方案:
KendoUI: resetting grid data to first page after button click
我在页面上有以下代码。
问题是,当单击 "MainSearchSubmit" 按钮时,方法 "RefreshGrid()" 导致对服务器进行 2 次后续 ajax 调用。我发现这是因为对 "datasource.read()" 和 "datasource.page(1)" 的调用都回发到服务器(它们都在 运行ning 数据源的 read() 方法)。
我仍然需要在点击搜索按钮时将网格页面设置为 1,否则有人可以在第 3 页,然后点击搜索按钮,获取更新的结果,但仍然在第 3 页。他们需要单击搜索按钮时将重置为第 1 页。
我还需要运行 read(),否则更新的参数不会被传递,数据也不会被刷新。
我找到了类似的帖子,其中一些人建议使用 .query() 方法。我试过了(代码在 "RefreshGrid()" 方法中被注释掉了),但这也导致了 2 个帖子到服务器。
关于如何解决这个问题的任何想法?
代码:
<script>
$(document).ready(InitializeNDCMapping);
function InitializeMainMapping() {
$("#MainSearchSubmit").click(function (e) {
RefreshGrid();
e.preventDefault();
});
}
function RefreshGrid() {
$("#MainListGrid").data("kendoGrid").dataSource.read();
$("#MainListGrid").data("kendoGrid").dataSource.page(1);
//Defunct code
//var dataSource1 = $("#NDCListGrid").data("kendoGrid").dataSource;
//dataSource.query({
// read: dataSource1.read(),
// page: dataSource1.Page(1),
// pagesize: dataSource1.PageSize(25)
//});
}
</script>
<div class="search-buttons">
<input type="submit" value="Search" id="MainSearchSubmit" />
<input type="button" value="Reset" onclick="ResetMainSearch()" />
</div>
<div>
@(Html.Kendo().Grid<BackOffice.ViewModels.NDCItem>()
.Name("MainListGrid")
.Filterable()
.Pageable(p => p.PageSizes(new int[] { 25, 50, 100 }).Input(true)
.Messages(m=>m.Empty("No Main-Ingredient found")).Numeric(false))
.Sortable()
.Navigatable()
.Selectable(selectable => selectable.Mode(GridSelectionMode.Single))
.Columns(columns =>
{
columns.Bound(l => l.NDCCode).Title("NDC Code").Width("5%")
.ClientTemplate(@Html.DialogFormLink("#=NDCCode#", Url.Action("NDCMappingEdit", new { NDCCode = "#=NDCCode#", mainMultumDrugCode = "#=MainMultumDrugCode#", drugId = "#=DrugId#", isMapped = "#=IsMapped#" }), "NDC Mapping", "", "", "NDCDialogLink", "1100", "600", "").ToHtmlString());
columns.Bound(l => l.Name).Title("Generic Name").Width("15%");
columns.Bound(l => l.MainCode).Hidden();
columns.Bound(l => l.MainId).Hidden();
columns.Bound(l => l.MainDescription).Title("Main Description").Width("15%");
columns.Bound(l => l.MainIngredientCode).Hidden();
columns.Bound(l => l.MainIngredient).Title("Main Ingredient").Width("15%");
columns.Bound(l => l.MainNumAmount).Title("Main Qty").Width("5%");
columns.Bound(l => l.MainNum).Title("Main Unit").Width("5%");
columns.Bound(l => l.MainDenomAmount).Title("Main Denom").Width("5%");
columns.Bound(l => l.MainDenom).Title("Main Denom Unit").Width("5%");
columns.Bound(l => l.IsMapped).Title("Mapped").Width("5%").Filterable(false).Sortable(false)
.ClientTemplate("<input type='checkbox' name='selected_#=MainCode#' class='chkbx select'" + "#= IsMapped ? 'checked' : ''#" + " />")
.HtmlAttributes(new { @class = "center", @onclick = "return false" })
.HeaderHtmlAttributes(new { @class = "center" });
})
.AutoBind(false)
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(false)
.Read(read => read.Action("MainList_Read", "Drug").Data("getRouteParams"))
.Model(model =>
{
model.Field(f => f.MainCode).Editable(false);
model.Field(f => f.MainName).Editable(false);
model.Field(f => f.MainDCCode).Editable(false);
model.Field(f => f.MainId).Editable(false);
model.Field(f => f.MainDescription).Editable(false);
model.Field(f => f.MainIngredientCode).Editable(false);
model.Field(f => f.MainIngredient).Editable(false);
model.Field(f => f.MainNumAmount).Editable(false);
model.Field(f => f.MainNum).Editable(false);
model.Field(f => f.MainDenomAmount).Editable(false);
model.Field(f => f.MainDenom).Editable(false);
model.Field(f => f.IsMapped).Editable(false);
})
.PageSize(25)
.Events(events => events.Error("MainRead_Error"))
)
)
</div>
以前遇到类似问题,几乎都是因为click handler被注册了两次,即使用户点击了一次button,handler却执行了两次。
你在哪里调用InitializeMainMapping()?另外,我不确定这是否是复制和粘贴错误,但 InitializeMainMapping() 缺少结束符 }。当用户单击按钮时,您是否收到任何 javascript 错误?
只是一些帮助您入门的想法。
我找到了解决方案。如果页面已设置为 1 并且您 运行...
grid.dataSource.page(1);
这导致读取。否则,如果页面尚未设置为 1 并且您 运行 上面的代码不会导致读取。所以问题的解决方案如下。
if (grid.dataSource.page() != 1) {
grid.dataSource.page(1);
}
grid.dataSource.read( {parameter: "value"} );
在这里找到了这个解决方案:
KendoUI: resetting grid data to first page after button click