在搜索按钮上单击调用控制器方法2

时间:2012-03-29 19:05:39

标签: asp.net-mvc-3 telerik-grid telerik-mvc

这是我的设置。我有Telerik Grid。这是.cshtml。

@(Html.Telerik().Grid<UserViewModel>().Name("UserGrid")
        .DataBinding(binding => binding.Ajax().Select("List", "Account", Model.ToRoute(Html))
                                              .Insert("Insert", "Account")
                                              .Delete("Delete", "Account")
                                              .Update("Save", "Account"))
        .DataKeys(keys => keys.Add(model => model.UserName))
        .ToolBar(toolbar => toolbar.Template(@<text>
                @Html.Partial("GridSearchTool")
            </text>))
        .Columns(columns =>
        {
            columns.Bound(u => u.Email)
                   .EditorTemplateName("EmailAddress")
                   .Filterable(true)
                   .Sortable(true)
                   .Width(300);
        })
        .Pageable()
        .Filterable()
        .Reorderable(reordering => reordering.Columns(true))
        .Scrollable(scrollable => scrollable.Height(500).Enabled(false))
        .Editable(editing => editing.Enabled(true)
                                    .DisplayDeleteConfirmation(true)
                                    .Mode(GridEditMode.PopUp)
                                    .TemplateName("UserEditor"))
        .ClientEvents(events => events.OnEdit("onRowEdit")
                                      .OnError("onGridError")
                                      .OnLoad("gridLoaded")
                                      .OnDataBinding("gridAjaxBinding")
                                      .OnDataBound("gridAjaxBound")
                                      .OnSave("gridAjaxSaved"))

以下是我的Global.ascx中的路线条目。

 routes.MapRoute(
                "Users", // Route Name
                "Account/{action}/{username}", // URL with parameters              
                new { controller = "Account", action = "Search", username = "" }
            );

您将看到我将Seach作为附加在网格工具栏中的局部视图放置。它作为一个文本框,按钮(搜索和清除)。

这是屏幕截图。

Image of my page

当我在控制器中加载网格时,这里是它调用的函数/动作。 1)行动指数 2)行动清单

这是exaple。

public ActionResult Index(string username)
        {
            return View(new GridViewModel
            {                
                Query = username,
                QueryField = "Email",
                GridName = "UserGrid",
                Controller = "Account"
            });
        }

  [Authorize(Roles = "Administrator")]
        [GridAction]
        public ActionResult List(string username)        
        {
            return Json(GetGridModel(DatabaseContext.FromContext()));
        }

我最初加载网格时工作正常。现在我的页面上有很多数据,我想找到一个特定的记录,所以我在搜索文本框的文本框中输入我的查询或字符串。当我这样做时,调用控制器方法。

1)索引(在搜索框中输入查询) 2)列表(在搜索框中输入查询) 3)列表(在搜索框中输入查询)

我不知道为什么它多次调用List方法。 我还试图通过调用不同的方法而不是索引来更改Global.ascx路由,但这不起作用。它仍然多次调用指数。

我很感激有关此问题的任何帮助或想法。

这里还有一些Javascript方法。

感谢您的快速回复。以下是我在其中一个java脚本中找到的方法。

gridAjaxBinding = function (evt) {
        var grid = $(evt.target);
        if (grid.length) {
            grid.block({
                message: '<div class="loading"><img src="/Content/images/busy.gif"><span>Loading...</span></div>'
            });
        }
    };
gridAjaxBound = function (evt) {
        var grid = $(evt.target);
        if (grid.length) {
            grid.unblock();
        }

        grid.unbind('edit', gridAjaxEditing);
        grid.bind('edit', gridAjaxEditing);

        var gridId = '#' + grid.attr('id');

        // Get the export link as jQuery object
        var $exportLink = $('#export');
        if ($exportLink.length) {
            grid = grid.data('tGrid');
            // Get its 'href' attribute - the URL where it would navigate to
            var href = $exportLink.attr('href');

            // Update the 'page' parameter with the grid's current page
            href = href.replace(/page=([^&]*)/, 'page=' + grid.currentPage);

            // Update the 'orderBy' parameter with the grids' current sort state
            href = href.replace(/orderBy=([^&]*)/, 'orderBy=' + (grid.orderBy || '~'));

            // Update the 'filter' parameter with the grids' current filtering state
            href = href.replace(/filter=(.*)/, 'filter=' + (grid.filterBy || '~'));

            // Update the 'href' attribute
            $exportLink.attr('href', href);
        }

        setupContextMenu(grid);
    };

谢谢, 的Vivek

1 个答案:

答案 0 :(得分:0)

这很可能是由于您没有发布的JavaScript代码。如果您在grid.filter(...)gridAjaxBinding中调用gridAjaxBound方法,则会出现此问题。我遇到了同样的问题,它与设置grid.filter两次有关。以下代码对我们有用(过度简化):

$("#button").on("click", function (event) {
  event.preventDefault();
  evo.filterGridData();
});

evo.filterGridData = function filterGridData() {
  var searchTerm = $("#searchTerm").val().replace(/'/g,"''");
  var grid = $("#grid").data("tGrid");
  grid.filter("substringof(FieldToSearchFor,'" + searchTerm + "')");
};