2012-03-29 2 views
0

Вот моя настройка. У меня есть сетка Telerik. Вот что .cshtml.Метод контроллера, называемый 2, нажатием кнопки поиска

@(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 = "" } 
      ); 

Увидеть, что у меня есть места, как частичный вид, прикрепленный к моей панели инструментов сетки. Он работает как текстовое поле, кнопки (поиск и очистка).

Вот скриншот.

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

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

ответ

0

Это, скорее всего, связано с яваскрипта кода вы не размещаете. Такое поведение возникает, если вы вызываете метод 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 + "')"); 
}; 
+0

Привет, я добавил эти два метода к моему вопросу. Можете ли вы просмотреть их и сообщить, если с ними что-то не так? Я также попытаюсь отладить эти методы. Спасибо за помощь. –

+0

В коде нет ничего подозрительного. Что произойдет, если вы оставите 'gridAjaxBound' пустым. Может быть, есть. в 'setupContextMenu', или кнопка поиска вызывает двойную перегруппировку. – Andreas

+0

Я нашел еще 1 вещь. В моем представлении GridSearchTool у меня есть код ниже dojo.addOnLoad (function() { applyGridFilter ('# @ Model.GridName', '@ Model.QueryField', '@ Html.Raw (Модель.Query) ',' substringof '); }); Этот код вызывает функцию applyGridFilter и там он вызывает функцию tGrid.filter. Вот код функции. Я могу скопировать эту функцию, если вы хотите просмотреть ее? –