【问题标题】:How to filter a Kendo UI MVC grid using a dropdown list如何使用下拉列表过滤 Kendo UI MVC 网格
【发布时间】:2014-05-23 18:43:15
【问题描述】:

我有一个剑道网格,它通过将下拉列表中的值推送到内置剑道过滤器中进行过滤。当我在文本框中输入值并搜索时,我可以使用相同的方法搜索网格。这是我的剑道网格和下拉菜单

 @(Html.Kendo().DropDownListFor(model => model.MyObject.ID)
           .Name("Objects").DataTextField("Value").DataValueField("Key")
           .BindTo(@Model.MyObjectList).AutoBind(true)
           .HtmlAttributes(new { id = "selectedObject" })
 <a class="button"  onclick="searchGrid()" id="search">Search</a>                       

@(Html.Kendo().Grid<MyViewModel>()
        .Name("MyGrid").HtmlAttributes(new { style = " overflow-x:scroll;" })
        .Columns(columns =>
        {
           columns.Bound(a => a.MyObject.Name).Title("Field 1");
            columns.Bound(a => a.Column2).Title("Field 2");
        }
        .Pageable(page => page.PageSizes(true))
        .Scrollable(src => src.Height("auto"))
        .Sortable()
        .Filterable()
        .Reorderable(reorder => reorder.Columns(true))
        .ColumnMenu()
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(10)
        .Read(read => read.Action("GetList_Read", "MyController"))
        )
    )

  <script>
       function searchGrid()
       {
          selectedObject = $("#selectedObject").data("kendoDropDownList");

          gridFilter = = { filters: [] };

          if ($.trim(selectedRecipient).length > 0) {
        gridListFilter.filters.push({ field: "Field 1", operator: "eq", value: selectedObject});
    }
        }
    var grid = $("#MyGrid").data("kendoGrid");
    grid.dataSource.filter(gridFilter);
  </script>

我的视图模型看起来像

 public class MyViewModel
 {
    public MyObject myObj {get;set;}
    public string Column2 {get;set;}
 }

当搜索字段是文本框时,上述功能有效,但当我使用下拉菜单时,它不起作用。我认为这是因为我将“MyObject”的 ID 推送到网格过滤器中,而网格填充了“MyObject”的名称。谁能告诉我如何解决这个问题。谢谢!!

【问题讨论】:

    标签: javascript kendo-ui kendo-grid kendo-asp.net-mvc


    【解决方案1】:

    我发现有两种方法可以处理这个问题。一种是将选定的值推送到内置的 Kendo 过滤器中,或者将值传递给控制器​​操作并在服务器端进行过滤。首先将下拉更改事件的选定值存储到一个名为'selectedDropDownValue'的对象

    过滤客户端(将值推送到 kendo 过滤器)

    function searchGrid()
    {
       var gridListFilter = { filters: [] };
       var gridDataSource = $("#MyGrid").data("kendoGrid").dataSource;
    
       gridListFilter.logic = "and";   // a different logic 'or' can be selected
        if ($.trim(selectedDropDownValue).length > 0) {
            gridListFilter.filters.push({ field: "MyObject.MyObjectID", operator: "eq", value: parseInt(selectedDropDownValue) });
        }
    
       gridDataSource.filter(gridListFilter);
       gridDataSource.read();
    }
    

    这会将下拉列表的选定值推送到内置的剑道网格过滤器

    过滤服务器端

    通过添加数据编辑DataSource读取行

    .Read(read => read.Action("GetApportionmentList_Read", "Apportionment").Data("AddFilter"))
    

    然后创建一个javascript函数来添加过滤器

    function AddFilter()
    {
       return {filter:selectedDropDownValue};
    }
    

    然后在搜索网格JS函数里面开始

    function searchGrid()
    {
       var gridListFilter = { filters: [] };
       var gridDataSource = $("#MyGrid").data("kendoGrid").dataSource;
       gridDataSource.read();
     }
    

    在读取调用之后,您仍然可以添加客户端过滤器,应用过滤器,然后进行读取调用。 控制器签名应如下所示

     public JsonResult GetList_Read([DataSourceRequest] DataSourceRequest request, string filter)
    

    过滤器将包含所选下拉列表的值

    【讨论】:

      【解决方案2】:

      在您的过滤器中设置

       value: selectedObject
      

      selectedObject 是实际的 Kendo DropDownList 小部件实例。 您需要使用 .value().text() 从小部件中获取值

      selectedObject = $("#selectedObject").data("kendoDropDownList").value();
      

      【讨论】:

      • 感谢您的帮助。尽管我无法使用提供的答案来解决问题,但这确实是个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多