【问题标题】:Kendo/JQuery searchbox doesn't search through `ICollection`?Kendo/JQuery 搜索框不搜索“ICollection”?
【发布时间】:2015-07-30 06:37:51
【问题描述】:

我有一个剑道网格,在 .ToolBar 我有一个搜索框,可以根据输入的内容过滤网格,总体而言,它运行良好。

问题在于它没有阅读/搜索涉及使用ICollection 的特定列(Maker & Associated)。我已经尝试了一些方法,但我不知道如何正确编写这些列的搜索。

我会注意到 MakerAssociated 列本身已正确填充,并且每个列自己的过滤器也可以正常工作

首先,这是一个精简的示例,说明如何在 Index.cshtml 中创建列和搜索框

@(Html.Kendo().Grid(Model).Name("gridWF")
.Columns(columns =>
    {
        column.Bound (p1 => p1.Id.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).InputWidth(90))).Width(150);
        column.Bound (p1 => p1.Name.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).InputWidth(90))).Width(150);
        column.Bound (p1 => p1.Item.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).InputWidth(90))).Width(150);
        column.Bound (p1 => p1.Maker.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).InputWidth(90))).Width(150);
        column.Bound (p1 => p1.Associated.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).InputWidth(90))).Width(150);
    }
.Pageable()
.ColumnMenu()
.ToolBar(toolBar => toolBar.Template(@<text><input class='k-textbox' value="Search..." onfocus="if (this.value=='Search...') this.value='';" onblur="this.value = this.value==''?'Search...':this.value;" id='searchbox'/></text>)
.DataSource(datasource => datasource.Ajax()
  .PageSize(15)
  .ServerOperation(false)
  .Read(r => r.Action("Read", "Workflows").Data("addSearch"))
  )  

<script type="text/javascript">
    function addSearch() {
        return { searchbox: $('#searchbox').val() };
    }
    $('#searchbox').keyup(function () {
        $('#gridWF').data('kendoGrid').dataSource.read();
    });
</script>

控制器的搜索部分

private IEnumerable<WorkflowViewModel> GetData(string searchbox = "")
        {
        var number = 0;
        int.TryParse (searchbox, out number);
        var result = (from w in Repo.GetWF()
                      where w.Id == number ||
                            w.Name.ToLower ().Contains (searchbox.ToLower ()) ||
//Failed attempt            w.UserRoles.Where (ur => ur.Role.Name.ToLower ().Contains (searchbox.ToLower())) != null || 
//Failed attempt            w.UserRoles.Where (ur => ur.Role != null && wr.Role.Name.ToLower().Equals ("maker", StringComparison.InvariantCultureIgnoreCase)).Select (wr => wr.UserName).FirstOrDefault ().Contains (searchbox.ToLower()) ||
                            w.ImportProduct.Item.Name.ToLower ().Contains (searchbox.ToLower ()) ||
                            searchbox == ""
                     select new ViewModel (w, User.Identity.Name)).ToList();
        return result;
        }

这是ViewModel.cs中的适用代码

public class ViewModel

  public ViewModel(Workflow workflow, string userName = null)
    {
    Id = workflow.Id;  
    Name = workflow.Name;  
    Item= workflow.ImportProduct.Item.Name  
    Maker= Workflow.GetByRoles(workflow, "maker");  
    Associated= Workflow.GetByRoles(workflow, "associated");  
    }

Workflow.cs

public class Workflow
    {
    public Workflow()
        {
        UserRoles = new List<UserRole>();
        }

        [Key]
        public int Id
            {
            get;
            set;
            }

        [Required(ErrorMessage="*")]
        [Display(Name="Name")]
        public string Name
            {
            get;
            set;
            }

        [Required]
        public int ImportId
            {
            get;
            set;
            }


        [ForeignKey("ImportId")]
        public virtual Product ImportProduct 
            {
            get;
            set;
            }

    public ICollection<UserRole> UserRoles 
        {
        get;
        set;
        }

    public static string GetByRoles (Workflow workflow, string role)
        {
        string userString = "";
        if(workflow.UserRoles != null)
            {
            var query = from ur in workflow.UserRoles
            where ur.Role.Name.ToLower() == role.ToLower()
            select ur.User.DisplayName;

            foreach(string user in query.ToList()
            {
            usersString += user + ",";
            }
            usersString = usersString.Trim(' ');
            usersString = usersString.Trim(',');
            }
        return usersString;
        }

如果我遗漏了什么,或者我有什么不清楚的地方,请发表评论,我会尽力澄清。

谢谢

更新:
我找到了一个可以成功搜索列的搜索框的解决方法。

//$('#searchbox').keyup(function () {
//    $('#gridWF').data('kendoGrid').dataSource.read();
//});
$('#searchbox').keyup(function () {
    var q = $("#searchbox").val();
    var int = parseInt(q); 
    var grid = $("#gridWF").data("kendoGrid");
    grid.dataSource.filter({
        logic: "or",
        filters: [
              { field: "Id", operator: "eq", value: int},
              { field: "Name", operator: "contains", value: q},
              { field: "Item", operator: "contains", value: q},
              { field: "Maker", operator: "contains", value: q },
              { field: "Associated", operator: "contains", value: q }
            ]
        }
    });  

但是,这段代码的行为并不符合我的需要。这类型进入每行顶部的所有过滤器框,这是不可接受的;我希望之前使用单个过滤器进行的任何过滤保持不变。

【问题讨论】:

    标签: c# ajax kendo-ui kendo-grid kendo-asp.net-mvc


    【解决方案1】:

    解决了!
    我在Controller.cs 中需要的行是:

    `w.UserRoles.Where (ur => ur.Role.Name.ToLower ().Contains ("maker")).Any (ur => ur.User.Name.ToLower ().Contains (searchbox.ToLower ())) ||` 
    

    我尝试失败的问题是.SelectSystem.Collections.Generic.IEnumerable&lt;bool&gt;|| 运算符不能使用它。 .Any 解决了这个问题,因为它确定是否有任何元素满足条件。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2016-10-19
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2013-03-30
      • 2015-01-28
      相关资源
      最近更新 更多