我正在使用jQuery DataTable,並發現一些很好的插件,使過濾更容易。這就是所謂的ColumnFilter,它可以在這裏找到:檢索jQuery DataTable的ColumnFilter插件的filtertype
http://code.google.com/p/jquery-datatables-column-filter/
使用這個插件是很容易的。聲明數據表之後,其配置是這樣的:
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)的幾個擴展方法中完成。
在某個地方存在一個策略,該策略包含一些獨立於實際類型的特定過濾器實現。這實現了動態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
這裏會發生什麼事,是這個地方擴展創建基本上是說像一個表達式「在哪裏(Description.ToLower()包含(filtertext)。)」 。
但是,我需要調用與UI中設置的filtertype對應的正確策略。目前,我只是擁有一個上下文類,它保存所有過濾器的實例,並實現遍歷所有過濾器的方法,檢查它決定是否應用此過濾器的條件。
如果我只是知道filtertype,會更容易。 :)
所以,問題是:
我怎麼能夠把從dataTable.columnFilter的aoColumns數組數據表的參數列表,這樣我可以從上面提到的DataProviderAction方法來訪問它?
我還不得更改DataTable,並/或columnFilter本身的任何代碼...