Метод контроллера вызывается 2 при нажатии кнопки поиска - PullRequest
0 голосов
/ 29 марта 2012

Вот мои настройки. У меня есть 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) Список действий

Вот пример.

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);
    };

Спасибо, Вивек

1 Ответ

0 голосов
/ 29 марта 2012

Скорее всего, это связано с тем, что вы не опубликовали код 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 + "')");
};
...