2012-03-29 78 views
0

這是我的設置。我有Telerik Grid。這就是.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 = "" } 
      ); 

您會看到我已將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); 
    }; 

感謝, 維韋克

回答

0

這很可能是由於JavaScript代碼,你沒有張貼。如果您在gridAjaxBindinggridAjaxBound中調用grid.filter(...)方法,則會發生此行爲。我面臨同樣的問題,這與設置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

嗨我已經將這2種方法添加到我的問題。你能否請他們回顧一下,讓我知道他們是否有什麼問題?我也會嘗試調試這些方法。 感謝您的幫助。 – 2012-03-29 20:26:23

+0

你的代碼中沒有任何可疑的東西。如果您將'gridAjaxBound'留空,會發生什麼情況。也許有某事。在'setupContextMenu'中或者搜索按鈕觸發一個雙重重新綁定。 – Andreas 2012-03-29 21:59:30

+0

我發現了1件事。在我的GridSearchTool視圖中,我有以下代碼 dojo.addOnLoad(function(){ applyGridFilter('#@ Model.GridName','@ Model.QueryField','@ Html.Raw(Model。查詢)','substringof'); }); 此代碼正在調用applyGridFilter函數並且它正在調用tGrid.filter函數。這裏是函數的代碼。 如果您想查看,我可以複製該功能嗎? – 2012-03-29 23:06:58

相關問題