在Asp.net中为jqGrid添加自己的搜索参数mvc

问题描述:

我刚刚开始研究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

首先关于参数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

是的,你可以使用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