Kendo UI Grid,将页面设置为1,没有双回发

时间:2015-11-13 23:29:33

标签: kendo-grid kendo-datasource

我在页面上有以下代码。

问题是当单击“MainSearchSubmit”按钮时,方法“RefreshGrid()”导致对服务器的2次后续ajax调用。我发现这是因为对“datasource.read()”和“datasource.page(1)”的调用都回发到服务器(它们都运行dataSource的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>

2 个答案:

答案 0 :(得分:1)

过去,当我遇到类似的问题时,几乎总是因为点击处理程序被注册了两次,即使用户点击按钮一次,处理程序也执行了两次。

你在哪里调用InitializeMainMapping()?此外,我不确定这是否是复制和粘贴错误,但InitializeMainMapping()缺少关闭}。当用户点击按钮时,您是否收到任何javascript错误?

让你开始的一些想法。

答案 1 :(得分:0)

我能够找到解决方案。如果页面已设置为1并且您运行...

grid.dataSource.page(1);

这导致读取。否则,如果页面尚未设置为1并且您运行上面的代码,则不会导致读取。所以问题的解决方案如下。

if (grid.dataSource.page() != 1) {
    grid.dataSource.page(1);
}

grid.dataSource.read( {parameter: "value"} );

在此处找到此解决方案:

drawImage