ASP.NET MVC 2.0 jqgrid中搜索的实现
您好,我正在尝试使用 MVC 2 IN .NET (VS 2008) 在 jqgrid 中使用单列搜索,这是我到目前为止的代码,但我需要一个示例来匹配它,或者提示我缺少的
jQuery("#list").jqGrid({
url: '/Home/DynamicGridData/',
datatype: 'json',
mtype: 'POST',
search: true,
filters: {
"groupOp":"AND",
"rules": [
{"field":"Message","op":"eq","data":"True"}
]
},
multipleSearch: false,
colNames: [ 'column1', 'column2'],
colModel: [
{ name: 'column1', index: 'column1', sortable: true, search: true,
sorttype: 'text', autoFit: true,stype:'text',
searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'column2', index: 'column2', sortable: true,search: false,
sorttype: 'text', align: 'left', autoFit: true}],
pager: jQuery('#pager'),
rowNum: 10,
rowList: [10, 60, 100],
scroll: true,
sortname: 'column2',
sortorder: 'asc',
gridview: true,
autowidth: true,
rownumbers: true,
viewrecords: true,
imgpath: '/scripts/themes/basic/images',
caption: 'my data grid'
});
jQuery("#list").jqGrid('navGrid', '#pager', {add: false, edit: false, del: false},
{}, {}, {}, { multipleSearch: true, overlay: false });
//jQuery("#list").jqGrid('filterToolbar', {stringResult:true, searchOnEnter:true});
jQuery("#list").jqGrid('navButtonAdd', '#pager',
{ caption: "Finding", title: "Toggle Search Bar",
buttonicon: 'ui-icon-pin-s',
onClickButton: function() { $("#list")[0].toggleToolbar() }
});
jQuery("#list").jqGrid = {
search : {
caption: "Search...",
Find: "Find",
Reset: "Reset",
odata : ['equal', 'not equal','contains'],
groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],
matchText: " match",
rulesText: " rules"
}
}
});
两件事分页没有出现 和搜索,尽管我打开的搜索窗口仅包含 hte column1 作为选项,当单击“查找”时,它似乎加载了网格,但实际上与我在文本框中键入的值不匹配。
更新:如您所见,我尝试了搜索参数,但没有成功,再次感谢您的帮助,非常感谢
//public ActionResult DynamicGridData(string sidx, string sord, int page, int rows,bool search, string fieldname,string fieldvalue)
public ActionResult DynamicGridData(string sidx, string sord, int page, int rows)
{
var context = new AlertsManagementDataContext();
int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalRecords = context.Alerts.Count();
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
IQueryable<Alert> alerts = null;
try
{
//if (!search)
//{
alerts = context.Alerts.
OrderBy(sidx + " " + sord).
Skip(pageIndex * pageSize).
Take(pageSize);
//}
//else
//{
// alerts = context.Alerts.Where (fieldname +"='"+ fieldvalue +"'").
// Skip(pageIndex * pageSize).
// Take(pageSize);
//}
}
catch (ParseException ex)
{
Response.Write(ex.Position + " " + ex.Message + " " + ex.Data.ToString());
}
//var alerts =
// from a in context.Alerts
// orderby sidx ascending
// select a;
var jsonData = new {
total = totalPages,
page = page,
records = totalRecords,
rows = (
from alert in alerts
select new {
id = alert.AlertId,
cell = new string[] {
"<a href=Home/Edit/"+alert.AlertId +">Edit</a> " +"|"+
"<a href=Home/Details/"+alert.AlertId +">Detail</a> ",
alert.AlertId.ToString() ,
alert.Policy.Name ,
alert.PolicyRule ,
alert.AlertStatus.Status ,
alert.Code.ToString() ,
alert.Message ,
alert.Category.Name}
}).ToArray()
};
return Json(jsonData);
}
Hi I am trying to use the single column search in jqgrid using MVC 2 IN .NET (VS 2008) this is the code I have so far but I need an example to match it with or a tip of what I am missing
jQuery("#list").jqGrid({
url: '/Home/DynamicGridData/',
datatype: 'json',
mtype: 'POST',
search: true,
filters: {
"groupOp":"AND",
"rules": [
{"field":"Message","op":"eq","data":"True"}
]
},
multipleSearch: false,
colNames: [ 'column1', 'column2'],
colModel: [
{ name: 'column1', index: 'column1', sortable: true, search: true,
sorttype: 'text', autoFit: true,stype:'text',
searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'column2', index: 'column2', sortable: true,search: false,
sorttype: 'text', align: 'left', autoFit: true}],
pager: jQuery('#pager'),
rowNum: 10,
rowList: [10, 60, 100],
scroll: true,
sortname: 'column2',
sortorder: 'asc',
gridview: true,
autowidth: true,
rownumbers: true,
viewrecords: true,
imgpath: '/scripts/themes/basic/images',
caption: 'my data grid'
});
jQuery("#list").jqGrid('navGrid', '#pager', {add: false, edit: false, del: false},
{}, {}, {}, { multipleSearch: true, overlay: false });
//jQuery("#list").jqGrid('filterToolbar', {stringResult:true, searchOnEnter:true});
jQuery("#list").jqGrid('navButtonAdd', '#pager',
{ caption: "Finding", title: "Toggle Search Bar",
buttonicon: 'ui-icon-pin-s',
onClickButton: function() { $("#list")[0].toggleToolbar() }
});
jQuery("#list").jqGrid = {
search : {
caption: "Search...",
Find: "Find",
Reset: "Reset",
odata : ['equal', 'not equal','contains'],
groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],
matchText: " match",
rulesText: " rules"
}
}
});
two things paging is not coming up
and search although I have the search window opening with just hte column1 as an option and when clicking the find it seems like it loads the grid but actually without matching my value that I type in the text box.
UPDATED: as you can see I made an attempt with the serach argument that did not succeed thanks again for your help it is appreciated
//public ActionResult DynamicGridData(string sidx, string sord, int page, int rows,bool search, string fieldname,string fieldvalue)
public ActionResult DynamicGridData(string sidx, string sord, int page, int rows)
{
var context = new AlertsManagementDataContext();
int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalRecords = context.Alerts.Count();
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
IQueryable<Alert> alerts = null;
try
{
//if (!search)
//{
alerts = context.Alerts.
OrderBy(sidx + " " + sord).
Skip(pageIndex * pageSize).
Take(pageSize);
//}
//else
//{
// alerts = context.Alerts.Where (fieldname +"='"+ fieldvalue +"'").
// Skip(pageIndex * pageSize).
// Take(pageSize);
//}
}
catch (ParseException ex)
{
Response.Write(ex.Position + " " + ex.Message + " " + ex.Data.ToString());
}
//var alerts =
// from a in context.Alerts
// orderby sidx ascending
// select a;
var jsonData = new {
total = totalPages,
page = page,
records = totalRecords,
rows = (
from alert in alerts
select new {
id = alert.AlertId,
cell = new string[] {
"<a href=Home/Edit/"+alert.AlertId +">Edit</a> " +"|"+
"<a href=Home/Details/"+alert.AlertId +">Detail</a> ",
alert.AlertId.ToString() ,
alert.Policy.Name ,
alert.PolicyRule ,
alert.AlertStatus.Status ,
alert.Code.ToString() ,
alert.Message ,
alert.Category.Name}
}).ToArray()
};
return Json(jsonData);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
可能是你的服务器端有问题。您能否在您的问题中附加您当前使用的
DynamicGridData
操作的代码。该操作应将filters
作为参数。您当前代码的某些部分绝对是错误的。例如,
jqGrid
是 jQuery 插件。因此,jQuery 的方法将通过主要的jqGrid
方法进行扩展,您可以将其用作jQuery("#list").jqGrid(...);
。所以在 jqGrid 初始化之后jQuery("#list").jqGrid
将是一个函数。在您的代码(最后一条语句)中,您使用对象{ search: { ... } }
覆盖jQuery("#list").jqGrid
方法。你应该做的事情就像这里描述的如何覆盖
emptyrecords
默认值。您不需要包含默认 jqGrid 设置中已经相同的值。此外,如果您在所有可搜索列上使用
searchoptions: { sopt: ['eq', 'ne', 'cn']}
,则无需进行更改。在您的问题文本中,您没有解释您想要做什么。您当前的代码是为了在初始网格加载时使用等于
true
的过滤器Message
。奇怪的是,网格中没有名为Message
的列。如果您只想向服务器发送一些附加信息,您最好使用postData
参数:我继续建议您从 jqGrid 定义中删除垃圾,例如
imgpath
和jqGrid 和
参数要么是未知的,要么是默认。sortable: true, search: true, sorttype: 'text', autoFit: true, stype:'text',align: 'left'
的 multipleSearch更新:Phil Haack 演示非常古老,它使用 LINQ to SQL。就像我之前写的那样(请参阅此处)实体框架(EF)允许使用排序、分页和过滤/搜索,无需使用
System.Linq.Dynamic
形式的 LINQ 动态查询库等任何插件。所以我给你做了一个演示,它是对 Phil Haack 演示到 EF。因为您使用旧版本的 Visual Studio(带有 ASP.NET MVC 2.0 的 VS2008),所以我也在 VS2008 中制作了演示。
您可以从此处下载我的VS2008演示和VS2010演示此处。
在代码中,我展示了(除了在 ASP.NET MVC 2.0 中使用高级搜索和工具栏搜索之外)如何以 JSON 格式从 ASP.NET MVC 返回异常信息以及如何使用 loadError 方法并显示相应的错误消息。
要从 ObjectQuery 表示 EF 对象 我定义了以下帮助程序类:
在示例中,我仅使用两种数据类型
整数
(Edm.Int32
) 和字符串
(Edm.String
)。您可以根据上面的propertyInfo.PropertyType.FullName
值轻松扩展示例以使用更多类型。向 jqGrid 提供数据的控制器操作非常简单:
为了以 JSON 形式将异常信息发送到 jqGrid,我替换了控制器的标准
[HandleError]
属性 (HomeController< /code>) 到我定义如下的
[HandleJsonException]
:在客户端,我使用了以下 JavaScript 代码:
结果是,如果输入任何非数字文本(如“ttt”) )在搜索工具栏中,控制器操作代码(在
Int32.Parse(rule.data)
中)收到异常。客户端将看到以下消息:我从控制器向 jqgrid 发送以下信息:所有内部异常。例如,连接到 SQL 服务器的错误将类似于
在现实世界中,请验证用户输入并抛出带有面向应用程序的错误消息的异常。我在演示中特别没有使用这种验证来表明所有类型的异常都将被 jqGrid 缓存和显示。
更新2:在答案您将找到修改后的 VS2010 演示(可从 这里)演示了 jQuery UI 自动完成的用法。 另一个答案进一步扩展代码以导出 Excel 格式包含的网格。
Probably you have problem on the server side. Could you append your question with the code of
DynamicGridData
action which you currently use. The action should havefilters
as the parameter.Some parts of your current code are definitively wrong. For example
jqGrid
is the jQuery plugin. So the methods of jQuery will be extended with the mainjqGrid
method which you use asjQuery("#list").jqGrid(...);
. So after the initializing of jqGridjQuery("#list").jqGrid
will be a function. In you code (the last statement) you overwrite thejQuery("#list").jqGrid
method with the object{ search: { ... } }
. What you should do instead islike for example here is described how to overwrite the
emptyrecords
default value. You don't need to include the values which are already the same in the default jqGrid settings.Moreover if you use
searchoptions: { sopt: ['eq', 'ne', 'cn']}
on all searchable columns you don't need to do the change.In the text of your question you don't explained what you want to do. Your current code is so that you use the filter
Message
equal totrue
at the initial grid loading. Strange is that there are no column with the nameMessage
in the grid. If you want just send some additional information to the server you should better usepostData
parameter:I continue to recommend you to remove garbage from the jqGrid definition like
imgpath
andmultipleSearch
parameters of jqGrid andsortable: true, search: true, sorttype: 'text', autoFit: true, stype:'text', align: 'left'
which are either unknown or default.UPDATED: The original code of the Phil Haack demo is very old and it use LINQ to SQL. Like I wrote before (see here) Entity Framework (EF) allows to use sorting, paging and filtering/searching without any AddOns like LINQ Dynamic Query Library in form
System.Linq.Dynamic
. So I made the demo you you which is modification of the the Phil Haack demo to EF.Because you use the old version of Visual Studio (VS2008 with ASP.NET MVC 2.0) I made the demo also in VS2008.
You can download my VS2008 demo from here and VS2010 demo here.
In the code I show (additionally to the usage of Advanced Searching and Toolbar Searching in ASP.NET MVC 2.0) how to return exception information from ASP.NET MVC in JSON format and how to catch the information with the loadError method and display the corresponding error message.
To construct the Where statement from the ObjectQuery represented EF object I define the following helper class:
In the example I use only two datatypes
integer
(Edm.Int32
) andstring
(Edm.String
). You can easy expand the example to use more types based as above on thepropertyInfo.PropertyType.FullName
value.The controller action which provide the data to the jqGrid will be pretty simple:
To send the exception information to the jqGrid in JSON form I replaced the standard
[HandleError]
attribute of the controller (HomeController
) to the[HandleJsonException]
which I defined as the following:On the client side I used the following JavaScript code:
As the result if one types any non-numeric text (like 'ttt') in the searching toolbar one receive exception the controller action code (in
Int32.Parse(rule.data)
). One the client side one will see the following message:I send from the controller to the jqgrid the information about all internal exceptions. So for example, the error in connection to the SQL server will looks like
In the real world one verify the users input and throws exception with application oriented error message. I used in the demo specially no such kind of validation to show that all kind of exception will be cached and display by jqGrid.
UPDATED 2: In the answer you will find the modified VS2010 demo (downloadable from here) which demonstrate the usage of jQuery UI Autocomplete. Another answer extend the code more to export the grid contain in Excel format.
查看以下链接:
Check out below links:
我尝试使用搜索参数但没有成功
return Json(jsonData);
}
I have made an attempt with search argument that did not succeed
return Json(jsonData);
}
服务器端搜索比您想象的要容易得多。
网格中的索引将作为参数出现在 json 调用中。
另外,GridSettings 参数中还有一个参数,如果是搜索,则该参数将设置为 true。它称为 IsSearch。 GridSettings 参数中还有一个排序顺序和列,可以帮助您构建 dy
所以,您会得到类似这样的东西。
It's a lot easier than you think for server side search.
Your indexes in your grid will come across in the json call as arguments.
Also there is a parameter in the GridSettings argument that will be set to true if it is a search.. It's called IsSearch. There is also a sortorder and column in the GridSettings argument that will help you build dy
So, you'd have something like this..