2012-03-29 63 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

相关问题