ASP.NET MVC 2.0在jqgrid中执行search
您好我想使用MVC 2在.NET(VS 2008)的jqgrid中的单列search这是迄今为止的代码,但我需要一个例子来匹配它或我缺less的一angular
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" } } });
两个东西分页是不是来了,search,虽然我有search窗口打开只有列1作为一个选项,当点击发现它似乎像加载网格,但实际上没有匹配我input的文本框中的值。
更新:正如你可以看到我做了一个尝试,但没有成功的serach论点再次感谢您的帮助,这是值得赞赏的
//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); }
可能你在服务器端有问题。 你可以追加你的问题与您目前使用的DynamicGridData
行动的代码。 该操作应该有filters
作为参数。
你当前代码的一些部分是完全错误的。 例如jqGrid
是jQuery插件。 所以jQuery的方法将会被扩展,使用jQuery("#list").jqGrid(...);
的主要jqGrid
方法jQuery("#list").jqGrid(...);
。 所以在jqGrid jQuery("#list").jqGrid
的初始化之后, jQuery("#list").jqGrid
将是一个函数。 在你的代码中(最后一条语句),你用对象{ search: { ... } }
覆盖了jQuery("#list").jqGrid
方法。 你应该做的是,而不是
jQuery.extend(jQuery.jgrid.search, { odata : ['equal', 'not equal','contains'] });
比如这里介绍如何覆盖emptyrecords
默认值。 您不需要在默认的jqGrid设置中包含已经相同的值。
此外,如果您在所有可search列上使用searchoptions: { sopt: ['eq', 'ne', 'cn']}
,则不需要执行更改。
在你的问题的文本中,你不解释你想要做什么。 您当前的代码是这样的,以便您在初始网格加载时使用filterMessage
等于true
。 奇怪的是,在网格中没有名称Message
列。 如果你只想发送一些额外的信息到服务器,你最好使用postData
参数:
postData: {Message:true}
我继续推荐你从jqGrid定义中删除垃圾,比如jgGrid的imgpath
和multipleSearch
参数,并sortable: true, search: true, sorttype: 'text', autoFit: true, stype:'text', align: 'left'
是未知的或默认的。
更新 : Phil Haack演示的原始代码非常古老,它使用LINQ to SQL。 就像我之前写过的(见这里 )entity framework(EF)允许使用sorting,分页和过滤/search没有任何添加如LINQdynamic查询库在formsSystem.Linq.Dynamic
。 所以我做了演示,你是Phil Haack演示的修改版本。
因为你使用Visual Studio的旧版本(VS2008和ASP.NET MVC 2.0),我也在VS2008中进行了演示。
您可以从这里下载我的VS2008演示,并在这里下载VS2010演示。
在我显示的代码中(除了使用ASP.NET MVC 2.0中的高级search和工具栏search),如何从JSON格式的ASP.NET MVC中返回exception信息以及如何使用loadError方法捕获信息并显示相应的错误信息。
为了从ObjectQuery表示的EF对象构造Where语句,我定义了下面的helper类:
public class Filters { public enum GroupOp { AND, OR } public enum Operations { eq, // "equal" ne, // "not equal" lt, // "less" le, // "less or equal" gt, // "greater" ge, // "greater or equal" bw, // "begins with" bn, // "does not begin with" //in, // "in" //ni, // "not in" ew, // "ends with" en, // "does not end with" cn, // "contains" nc // "does not contain" } public class Rule { public string field { get; set; } public Operations op { get; set; } public string data { get; set; } } public GroupOp groupOp { get; set; } public List<Rule> rules { get; set; } private static readonly string[] FormatMapping = { "(it.{0} = @p{1})", // "eq" - equal "(it.{0} <> @p{1})", // "ne" - not equal "(it.{0} < @p{1})", // "lt" - less than "(it.{0} <= @p{1})", // "le" - less than or equal to "(it.{0} > @p{1})", // "gt" - greater than "(it.{0} >= @p{1})", // "ge" - greater than or equal to "(it.{0} LIKE (@p{1}+'%'))", // "bw" - begins with "(it.{0} NOT LIKE (@p{1}+'%'))", // "bn" - does not begin with "(it.{0} LIKE ('%'+@p{1}))", // "ew" - ends with "(it.{0} NOT LIKE ('%'+@p{1}))", // "en" - does not end with "(it.{0} LIKE ('%'+@p{1}+'%'))", // "cn" - contains "(it.{0} NOT LIKE ('%'+@p{1}+'%'))" //" nc" - does not contain }; internal ObjectQuery<T> FilterObjectSet<T> (ObjectQuery<T> inputQuery) where T : class { if (rules.Count <= 0) return inputQuery; var sb = new StringBuilder(); var objParams = new List<ObjectParameter>(rules.Count); foreach (Rule rule in rules) { PropertyInfo propertyInfo = typeof (T).GetProperty (rule.field); if (propertyInfo == null) continue; // skip wrong entries if (sb.Length != 0) sb.Append(groupOp); var iParam = objParams.Count; sb.AppendFormat(FormatMapping[(int)rule.op], rule.field, iParam); // TODO: Extend to other data types objParams.Add(String.Compare(propertyInfo.PropertyType.FullName, "System.Int32", StringComparison.Ordinal) == 0 ? new ObjectParameter("p" + iParam, Int32.Parse(rule.data)) : new ObjectParameter("p" + iParam, rule.data)); } ObjectQuery<T> filteredQuery = inputQuery.Where (sb.ToString ()); foreach (var objParam in objParams) filteredQuery.Parameters.Add (objParam); return filteredQuery; } }
在这个例子中,我只使用了两个数据typesinteger
( Edm.Int32
)和string
( Edm.String
)。 你可以很容易的扩展这个例子,在propertyInfo.PropertyType.FullName
值上使用更多的types。
向jqGrid提供数据的控制器动作非常简单:
public JsonResult DynamicGridData(string sidx, string sord, int page, int rows, bool _search, string filters) { var context = new HaackOverflowEntities(); var serializer = new JavaScriptSerializer(); Filters f = (!_search || string.IsNullOrEmpty (filters)) ? null : serializer.Deserialize<Filters> (filters); ObjectQuery<Question> filteredQuery = (f == null ? context.Questions : f.FilterObjectSet (context.Questions)); filteredQuery.MergeOption = MergeOption.NoTracking; // we don't want to update the data var totalRecords = filteredQuery.Count(); var pagedQuery = filteredQuery.Skip ("it." + sidx + " " + sord, "@skip", new ObjectParameter ("skip", (page - 1) * rows)) .Top ("@limit", new ObjectParameter ("limit", rows)); // to be able to use ToString() below which is NOT exist in the LINQ to Entity var queryDetails = (from item in pagedQuery select new { item.Id, item.Votes, item.Title }).ToList(); return Json(new { total = (totalRecords + rows - 1) / rows, page, records = totalRecords, rows = (from item in queryDetails select new[] { item.Id.ToString(), item.Votes.ToString(), item.Title }).ToList() }); }
为了将exception信息以JSON格式发送到jqGrid,我将控制器( HomeController
)的标准[HandleError]
属性replace为我定义的[HandleJsonException]
,如下所示:
// to send exceptions as json we define [HandleJsonException] attribute public class ExceptionInformation { public string Message { get; set; } public string Source { get; set; } public string StackTrace { get; set; } } public class HandleJsonExceptionAttribute : ActionFilterAttribute { // next class example are modification of the example from // the http://www.dotnetcurry.com/ShowArticle.aspx?ID=496 public override void OnActionExecuted(ActionExecutedContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null) { filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; var exInfo = new List<ExceptionInformation>(); for (Exception ex = filterContext.Exception; ex != null; ex = ex.InnerException) { PropertyInfo propertyInfo = ex.GetType().GetProperty ("ErrorCode"); exInfo.Add(new ExceptionInformation() { Message = ex.Message, Source = ex.Source, StackTrace = ex.StackTrace }); } filterContext.Result = new JsonResult() {Data=exInfo}; filterContext.ExceptionHandled = true; } } }
在客户端,我使用了下面的JavaScript代码:
var myGrid = $('#list'), decodeErrorMessage = function(jqXHR, textStatus, errorThrown) { var html, errorInfo, i, errorText = textStatus + '\n' + errorThrown; if (jqXHR.responseText.charAt(0) === '[') { try { errorInfo = $.parseJSON(jqXHR.responseText); errorText = ""; for (i=0; i<errorInfo.length; i++) { if (errorText.length !== 0) { errorText += "<hr/>"; } errorText += errorInfo[i].Source + ": " + errorInfo[i].Message; } } catch (e) { } } else { html = /<body.*?>([\s\S]*)<\/body>/.exec(jqXHR.responseText); if (html !== null && html.length > 1) { errorText = html[1]; } } return errorText; }; myGrid.jqGrid({ url: '<%= Url.Action("DynamicGridData") %>', datatype: 'json', mtype: 'POST', colNames: ['Id', 'Votes', 'Title'], colModel: [ { name: 'Id', index: 'Id', key: true, width: 40, searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'] } }, { name: 'Votes', index: 'Votes', width: 40, searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'] } }, { name: 'Title', index: 'Title', width: 400, searchoptions: { sopt: ['cn', 'nc', 'bw', 'bn', 'eq', 'ne', 'ew', 'en', 'lt', 'le', 'gt', 'ge'] } } ], pager: '#pager', rowNum: 10, rowList: [5, 10, 20, 50], sortname: 'Id', sortorder: 'desc', rownumbers: true, viewrecords: true, altRows: true, altclass: 'myAltRowClass', height: '100%', jsonReader: { cell: "" }, caption: 'My first grid', loadError: function(jqXHR, textStatus, errorThrown) { // remove error div if exist $('#' + this.id + '_err').remove(); // insert div with the error description before the grid myGrid.closest('div.ui-jqgrid').before( '<div id="' + this.id + '_err" style="max-width:'+this.style.width+ ';"><div class="ui-state-error ui-corner-all" style="padding:0.7em;float:left;"><span class="ui-icon ui-icon-alert" style="float:left; margin-right: .3em;"></span><span style="clear:left">' + decodeErrorMessage(jqXHR, textStatus, errorThrown) + '</span></div><div style="clear:left"/></div>') }, loadComplete: function() { // remove error div if exist $('#' + this.id + '_err').remove(); } }); myGrid.jqGrid('navGrid', '#pager', { add: false, edit: false, del: false }, {}, {}, {}, { multipleSearch: true, overlay: false }); myGrid.jqGrid('filterToolbar', { stringResult: true, searchOnEnter: true, defaultSearch: 'cn' }); myGrid.jqGrid('navButtonAdd', '#pager', { caption: "Filter", title: "Toggle Searching Toolbar", buttonicon: 'ui-icon-pin-s', onClickButton: function() { myGrid[0].toggleToolbar(); } });
因此,如果在search工具栏中input任何非数字文本(如'ttt'), Int32.Parse(rule.data)
收到控制器操作代码(在Int32.Parse(rule.data)
)中的Int32.Parse(rule.data)
。 一个客户端会看到以下消息:
我从控制器发送给jqgrid有关所有内部exception的信息。 因此,例如,连接到SQL服务器的错误将如下所示
在现实世界中,validation用户input并抛出与应用程序导向的错误消息的exception。 我在演示中特别没有使用这种validation来显示所有types的exception将被caching,并由jqGrid显示。
更新2 :在答案你会发现修改后的VS2010演示(从这里下载),演示了jQuery UI自动完成的使用。 另一个答案扩展代码更多的导出格式包含在Excel格式。
看看下面的链接:
- jqGrid和ASP.NET MVC – search< – ASP.NET MVC LinqToSql
- ASP.NET MVC 3和Razor中的jqGrid < – 很多示例,ASP.NET MVC 3,Razor
- ASP.NET MVC中的jqGrid – 强types的帮助器< – 与上面相同的示例,但强types的帮助器和entity frameworkCode-First
我试图用没有成功的search论点
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() };
返回Json(jsonData); }
这比服务器端search要容易得多。 您的网格中的索引将作为参数在json调用中遇到。 GridSettings参数中还有一个参数,如果它是一个search,它将被设置为true。它被称为IsSearch。 GridSettings参数中还有一个sortorder和column,可以帮助你构builddy
所以,你会有这样的事情
public JsonResult GetUsers(GridSettings gridSettings, string FirstName, string LastName) { // conditional logic and queries here and return results) }
- ASP.NET MVC – 在视图或控制器中获取当前区域名称
- 如何编写一个简单的Html.DropDownListFor()?
- ASP.NET MVC – 根据Active Directoryvalidation用户,但要求input用户名和密码
- 如何获取由asp.net MVC EditorFor生成的HTML标识
- 在Application_BeginRequest中设置会话variables
- 如何在MVC中设置默认路由(到区域)
- MVC2中的Html.Partial(view,model)和Html.RenderPartial(view,model)之间有什么区别(如果有的话)?
- 使用数据注释自定义模型依赖属性的validation
- 在剃刀foreach上获取索引值