我正在使用 jQuery DataTable 并找到了一些不错的插件来简化过滤。它称为 ColumnFilter,可在此处获得:
http://code.google.com/p/jquery-datatables-column-filter/
使用这个插件真的很容易。在声明 DataTable 之后,它的配置如下:
oTable.columnFilter({
aoColumns: [
{ type: "number-range" },
{ type: "text" },
{ type: "text" }
]
});
在实际过滤数据源服务器端时,我需要知道 columnfilter 插件中设置了哪些类型。这背后的原因是,我封装了一种通用的过滤方法,基本上允许我在服务器端控制器操作中的实体上执行此操作:
Public Function DataProviderAction(ByVal dataTableParams As JQueryDataTableParamModel) As JsonResult
Return GetJson(dataTableParams, Request.Params,
Function(r) New String() {
Convert.ToString(r.Id),
r.Description,
r.Comment})
End Function
这是因为控制器派生自 T 的通用基本控制器这一事实。GetJson 方法需要 Lambda 表达式来创建字符串数组。其余的(过滤、排序和分页)在 IQueryable(Of T) 上的几个扩展方法中完成。
在未来的某个地方,存在一种策略,该策略包含几个独立于实际类型的特定过滤器实现。这是通过 Dynamic Linq 实现的,如下所示:
Public Function ApplyFilter(Of T As {IDataObject})(entities As IQueryable(Of T), filterInfo As System.Tuple(Of String, String)) As IQueryable(Of T) Implements ISmartFilter.ApplyFilter
Dim result As IQueryable(Of T) = Nothing
Try
result = entities.Where(If(filterInfo.Item1 = "", True, String.Format("{0}.ToLower().Contains(@0)", filterInfo.Item2)), filterInfo.Item1.ToLower)
Catch
End Try
Return result
End Function
这里发生的情况是,这个 Where 扩展创建了一个表达式,基本上说类似“Where(Description.ToLower().Contains(filtertext))”。
但是,我需要调用与 UI 中设置的过滤器类型相对应的正确策略。目前,我只是有一个上下文类,它包含所有过滤器的实例并实现一个迭代所有过滤器的方法,检查它决定是否应用此过滤器的条件。
如果我只知道过滤器类型会更容易。:)
所以问题是:
如何将 dataTable.columnFilter 中的 aoColumns 数组放入 DataTable 的参数列表中,以便可以从上面提到的 DataProviderAction 方法访问它?
我也不得更改 dataTable 和/或 columnFilter 本身的任何代码......