2012-09-24 38 views
0

我正在使用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本身的任何代碼...

回答

0

唔...我莫名其妙地發現類似的解決方案。

做你們怎麼看:

在數據表中我的jQuery初始化代碼,我添加了這樣的過濾式信息的數組:

var filterList = [ 
       { type: "" }, 
       { type: "number-range" }, 
       { type: "text" }, 
       { type: "text" } 
      ]; 

我再定義,創建一個輔助函數夫婦的aodata。推調用這些filtertypes注入到我的JSON字符串:

fnServerObjectToArray = function() { 
     return function (sSource, aoData, fnCallback) { 

      for (i = 0; i < filterList.length; i++) { 
       aoData.push({ "name": "sFilter_" + i, "value": filterList[i].type }); 
      } 

      $.getJSON(sSource, aoData, function (json) { 
       fnCallback(json); 
      }); 
     } 
    } 

在我的數據表初始化我添加此功能fnServerData:

var oTable = $('#myDataTable').dataTable({ 
    ...   
    "sAjaxSource": "MyController/DataProviderAction", 
      "fnServerData": fnServerObjectToArray(), 
... 
}); 

而且columnFilter本身現在基於以上定義的數組:

oTable.columnFilter({ 
      aoColumns: filterList 
     }); 

在戰略之前,上下文現在在字典中包含可用的過濾器:

Private Shared availableFilters As New Dictionary(Of String, ISmartFilter) From { 
      {"number", New NumberFilter()}, 
      {"number-range", New NumberRangeFilter()}, 
      {"text", New TextFilter()} 
     } 

這樣,我現在可以以這樣的方式應用相應的過濾器:

Public Shared Function ApplyFilter(Of T As {IDataObject})(entities As IQueryable(Of T), filterInfo As System.Tuple(Of String, String, String)) As IQueryable(Of T) 

      Dim filteredEntities As IQueryable(Of T) 

      Dim filter As ISmartFilter = Nothing 

      If (availableFilters.TryGetValue(filterInfo.Item3.ToLower(), filter)) Then 
       filteredEntities = availableFilters(filterInfo.Item3).ApplyFilter(entities, filterInfo) 
      Else 
       ' Default-Filter 
       filteredEntities = availableFilters("text").ApplyFilter(entities, filterInfo) 
      End If 

      Return filteredEntities 
     End Function 
相關問題