2010-04-20 20 views
3

我剛剛開始研究asp.net mvc和jqgrid。在Asp.net中爲jqGrid添加自己的搜索參數mvc

我有一個日曆,它返回一個日期,一個多選列表框,並在網格外應用過濾器按鈕。有沒有一種方法可以根據選定的日期和多個選定的值將這些過濾器值傳遞給服務器端actionresult GridData(),並且在分頁或排序時它仍然存在。

公衆的ActionResult的GridData(字符串SIDX,串SORD,詮釋?頁,INT?行,收藏categoryOptions,串FROM日期) {..}

謝謝!

+0

您可以將過濾器會話,並與每一個asynchronic數據請求應用它們。 – LukLed 2010-04-20 11:08:39

+0

感謝Lukled在會話中存儲過濾器爲我工作 – paresh 2010-04-21 09:07:32

+0

在會話中存儲過濾器時出現的問題是:當我使用不同的過濾器打開兩個窗口時,發生同一頁面?我將成爲一個非常困惑的用戶。 – Ryan 2010-04-21 16:09:58

回答

1

首先關於參數postData(請參閱http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options),您可以向服務器發送附加信息。在Should one replace the usage addJSONData of jqGrid to the usage of setGridParam(), and trigger('reloadGrid')?你可能也可以找到一些信息,這可以幫助你在jqGrid中進行數據刷新。

在我看來,這可能不是jqGrid以外的自定義過濾標準數據過濾(搜索)可以幫助你。我在某些網頁上使用混合自定義過濾,並幾乎在任何地方使用「高級搜索」(請參閱​​http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching)。 「高級搜索」是一種讓您可以在不同條件下同時搜索多個字段的方式。

您的網址會被追加:

_search = {_搜索} &頁= {PAGE} &行= {行} & SIDX = {sortIndex} & SORD = {sortDirection} & searchField = {searchField } &搜索字符串= {}搜索字符串& searchOper = {} searchOper過濾& = {}過濾

,你應該更新你的函數原型記者。從過濾器的信息JSON壓縮對象像

filters = 
    {"groupOp":"AND", 
    "rules":[ 
     {"field":"invdate","op":"ge","data":"2007-10-06"}, 
     {"field":"invdate","op":"le","data":"2007-10-20"}, 
     {"field":"name","op":"bw","data":"Client 3"} 
     ] 
    } 

分析從過濾信息我個人使用DataContractJsonSerializer。該代碼片段是:

MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (filters)); 
DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof(jqGridSearchFilter)); 
ms.Position = 0; 

jqGridSearchFilter searchFilter = (jqGridSearchFilter)serializer.ReadObject (ms); 
string groupOp = null; 
if (!String.IsNullOrEmpty(searchFilter.groupOp) && 
    String.Compare (searchFilter.groupOp, "AND", StringComparison.Ordinal) == 0) 
    groupOp = "AND"; 
else if (!String.IsNullOrEmpty(searchFilter.groupOp) && 
     String.Compare (searchFilter.groupOp, "OR", StringComparison.Ordinal) == 0) 
    groupOp = "OR"; 
else { 
    arSearchStringParameters = null; 
    return null; 
} 
for (int i=0; i "WHERE ".Length) 
     sb.Append (groupOp); 
    AppendWhere (sb, _search, 
     searchFilter.rules[i].field, searchFilter.rules[i].op, searchFilter.rules[i].data, 
     arColumnInfos, parameters); 
}

其中

internal enum GroupOperation { 
    AND, 
    OR 
} 

[DataContract] 
internal class jqGridSearchFilterItem { 
    [DataMember] 
    internal string field = null; 
    [DataMember] 
    internal string op = null; 
    [DataMember] 
    internal string data = null; 
} 

[DataContract] 
internal class jqGridSearchFilter { 
    [DataMember] 
    internal string groupOp = null; //GroupOperation groupOp; 

    [DataMember] 
    internal List rules = null; 
}
+0

這似乎是非常複雜的,我們不能嘗試使用會話 – paresh 2010-04-21 04:21:42

+0

我你有一張桌子,需要過濾兩個字段,你是絕對正確的。但是,如果這張表只是一個小例子來展示你的問題 - 我建議你嘗試在多搜索表中實現搜索。您編寫一個代碼並將其用於所有您獨立於其複雜性的jqGrid。 通常我使用外部過濾主要用於組合過濾,如夏季,假日等過濾,而不是隻搜索一天。有趣的是您可以使用「集成搜索工具欄」(參見http://trirand.com/blog/jqgrid/jqgrid.html「3.5版新功能」) – Oleg 2010-04-21 08:55:02

+0

外部過濾和「集成搜索工具欄」適合標準用戶。每個用戶立即看到過濾的可能性「高級搜索」適用於要求您在所有網格中導出Excel的用戶。如果您的網格應用程序具有大量網格,那麼應用程序的用戶知道用戶界面(GUI)的可能性。高級用戶喜歡「高級搜索」。 – Oleg 2010-04-21 09:00:57

5

是的,你可以使用POSTDATA屬性與每個請求發送額外的濾波參數。請注意,只有當您使用JSON來填充網格時,此功能纔有效。只需要一個返回JsonResult的動作即可。

在你的jqGrid配置包括:

 
postData: { 
    startDate: function() { return $('#startDate').val(); }, 
    anotherFilter: function() { return $('#anotherFilter').val(); } 
} 

對於您的應用篩選按鈕調用$( '#GridName')觸發器( 'reloadGrid')。或者,我喜歡在過濾器更改時重新加載網格。你可以使用jQuery做到這一點:

 
$('#filterName').change(function(){$('#GridName').trigger('reloadGrid');}) 

你的JSON應該包含這些屬性的jqGrid理解它:

 
total = pagedList.PageCount, 
page = pagedList.PageNumber, 
records = pagedList.TotalItemCount, 
rows = pagedList.ToArray() 
+0

在postData中使用函數的好主意!我之前不知道,$ .ajax中使用的$ .param函數支持函數類型。 – Oleg 2010-04-21 09:17:25

+0

設置過濾器應該在'change'和'keyup'事件中使用。我的意思是,但不是寫在我的答案。再好一次! if(keyCode === 33/* page up */|){('#filterName')。 | keyCode === 34/* page down */|| keyCode === 35/* end */|| keyCode === 36/* home */|| keyCode === 38/*向上箭頭*/|| keyCode === 40/*向下箭頭* /){ myRefresh(); } }); 也需要支持所選元素的鍵盤輸入。 – Oleg 2010-04-21 09:19:09

+0

我忘了提及我試圖讓我的JS非常標準化,以便我可以使用HtmlHelpers來構建它。上面的代碼在我的系統中看起來像postData:{JqGridPostFilterValues(x => x.StartDate,x => s.AnotherFilter)} – Ryan 2010-04-21 15:06:41