微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery DataTable 自定义按钮正则表达式列搜索

如何解决jQuery DataTable 自定义按钮正则表达式列搜索

我使用 jQuery DataTable 来呈现服务器端数据。我能够搜索某个字符串并基于它呈现 DataTable,但我想匹配多个字符串,但以下代码不起作用。

如何在服务器端渲染dt.column(8).search('^(400|404)$',true,false).draw();

"buttons": [
    'copy','csv',{
        text: 'Show All',action: function(e,dt,node,config) {
            dt.column(8).search('').draw();
        }
    },{
        text: 'Show Only Errors',config) {
            dt.column(8).search('^(400|404)$',false).draw();
        }
    }
],

服务端代码

public static IQueryable < T > ToIndividualColumnSearch < T > (this IQueryable < T > table,DTParameters Param) {
    if (Param?.Columns != null && Param.Columns.Length > 0 && table.FirstOrDefault() != null) {
        Type EntityType = table.FirstOrDefault().GetType();
        var Properties = EntityType.GetProperties();

        //listing necessary column where individual columns search has applied. Filtered with search text as well it data types
        Param.Columns.Where(w => !string.IsNullOrEmpty(w.Search?.Value)).ToList().ForEach(x => {
            foreach(var match in Properties.Where(p => p.Name == x.Data)) {
                switch (match.PropertyType) {
                    case var i when(i == typeof(system.int32)) | (i == typeof(system.int32 ? )):
                        if (int.TryParse(x.Search.Value,out int intValue)) {
                            table = table.Where(x.Data + " = @0",intValue);
                        }
                    break;

                    case var b when(b == typeof(System.Boolean)) | (b == typeof(System.Boolean ? )):
                        bool searchValue = false;

                    if (bool.TryParse(x.Search.Value,out searchValue)) {
                        table = table.Where(x.Data + " = @0",searchValue);
                    } else
                    if (int.TryParse(x.Search.Value,out int bool2Int)) {
                        searchValue = bool2Int == 1;
                        table = table.Where(x.Data + " = @0",searchValue);
                    } else {
                        switch (x.Search.Value) {
                            case var yes when string.Compare(x.Search.Value,"yes",true) == 0:
                                table = table.Where(x.Data + " = @0",true);
                            break;

                            case var no when string.Compare(x.Search.Value,"no",false);
                            break;
                        }
                    }
                    break;

                    case var d when(d == typeof(System.DateTime)) | (d == typeof(System.DateTime ? )):
                        foreach(string dateTimeFormat in new string[] {
                            "yyyy-MM-dd","dd-MM-yyyy"
                        }) {
                            string[] bounds = System.Text.RegularExpressions.Regex.Split(x.Search.Value,"( - )");

                            if (bounds.Length == 3) {
                                if (DateTime.TryParseExact(bounds[0],dateTimeFormat,CultureInfo.InvariantCulture,DateTimeStyles.None,out DateTime lowerBound) &&
                                    (DateTime.TryParseExact(bounds[2],out DateTime upperBound))) {
                                    upperBound = upperBound.AddDays(1);
                                    table = table.Where(string.Format("{0} >= DateTime({1},{2},{3}) AND {0} < DateTime({4},{5},{6})",x.Data,lowerBound.Year,lowerBound.Month,lowerBound.Day,upperBound.Year,upperBound.Month,upperBound.Day));
                                    break;
                                }
                            }

                            if (DateTime.TryParseExact(x.Search.Value,out DateTime CreatedOn)) {
                                DateTime upperBound = CreatedOn.AddDays(1);
                                table = table.Where(string.Format("{0} >= DateTime({1},CreatedOn.Year,CreatedOn.Month,CreatedOn.Day,upperBound.Day));
                                break;
                            }
                        }
                    break;

                    case var s when(s == typeof(System.String)):
                        table = table.Where(x.Data + ".Contains(@0)",x.Search.Value);
                    break;
                }
            }
        });
    }

    return table;
}

P.S -> 如果我只搜索dt.column(8).search(400,false).draw(); 这样的 1 个字符串,它可以工作但不是正则表达式吗?我该怎么做才能让它在服务器端工作?或者正则表达式只适用于客户端渲染?

附上截图供您参考。

使用 dt.column(8).search('^(400|404)$',false).draw();

enter image description here

使用 dt.column(8).search(400,false).draw();

enter image description here

解决方法

你可以试试:(也许你在数字之前或之后有空格)

2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。