问题描述
我使用 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();
时
使用 dt.column(8).search(400,false).draw();
时
解决方法
你可以试试:(也许你在数字之前或之后有空格)
2