http://www.cnblogs.com/nickppa/p/3232535.html
asp.net mvc多条件+分页查询解决方案
开发环境vs2010
css:bootstrap
js:jquery
bootstrap paginator
原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了MVC多条件+分页查询
因为美工不是很好,所以用的是bootstrap前端框架,自己懒得写前端的分页控件,用的是bootstrap paginator分页控件。
方式:
用Get方式提交检索条件,分页可用2种模式,无刷新或者带刷新的跳转。
Shared\_Layout.cshtml中添加css、js脚本引用:
查询页面(View)Index.cshtml:
引用分页插件库、生成分页脚本,定义分页跟数据展现的分部视图:
@Url.IncludePagerScript() @Html.Pager("#pager", "#Content", "/Search/?page=", Model)
<div class="container"> <div id="pager"></div> <div id="Content"> @Html.Partial("IndexTable") </div> </div>
封装了下分页脚本:
@Html.Pager(分页控件, 数据展现, 分页的查询地址, 继承PagerSearchBase的Model,是否刷新默认为刷新的)
若要切换成分页的无刷新模式,只需要写成@Html.Pager("#pager", "#Content", "/Search/?page=", Model, false)
定义查询表单:
@using(Html.BeginForm("Index", "Search", FormMethod.Get, new { @class = "form-search form-inline" })) { <div class="input-append"> @Html.TextBoxFor(model => model.UserName, new { @class = "span2 search-query" }) <button type="submit" class="btn"> 快速查询</button> </div> }
整个Index.cshtml与分部视图IndexTable.cshtml的源代码:
控制器(Control)SearchController.cs:
Index:
1 public ActionResult Index(int page = 1) 2 { 3 SearchModel conditionData = SearchModel.Create(Request, GetMembers()); 4 conditionData.Search(page); 5 6 if(Request.IsAjaxRequest()) return PartialView("IndexTable", conditionData); 7 return View("Index", conditionData); 8 }
取得数据(测试数据):
模型(Model)SearchModel.cs、Member.cs:
SearchModel继承自PagerSearchBase
1 public class SearchModel : PagerSearchBase 2 { 3 public string UserName { get; set; } 4 5 public IEnumerable<Member> Members { get; set; } 6 }
创建SearchModel对象的方法:
1 public static SearchModel Create(HttpRequestBase request, IEnumerable<Member> members) 2 { 3 SearchModel result = new SearchModel(); 4 result.AddFields(request, "UserName");
5 result.Members = members; 6 return result; 7 }
protected void AddFields(HttpRequestBase request, params string[] fieldNames);
用于添加查询条件的属性名,并为属性设置值,这里的属性只能是string类型的
重载子类的SearchByPage函数
1 protected override void SearchByPage(int page) 2 { 3 // 过滤 4 Members = Members.Where(UserName, entity => entity.UserName.Contains(UserName)); 5 // 分页 6 Members = Pager(Members.OrderBy(entity => entity.UserName)); 7 }
扩展了下IEnumerable<TSource>的Where函数,若遇到UserName为空,则不进行条件过滤,且能链式调用
PagerSearchBase.cs基类
Member.cs
1 public class Member 2 { 3 public string UserName { get; set; } 4 public int Age { get; set; } 5 public string Sex { get; set; } 6 }
这样就完成了多条件查询+分页的页面。
如果要增加条件,就只要修改Model跟View就可以了
如要增加个Age的条件:
修改Model:
增加属性字段:public string Age { get; set; }
原result.AddFields(request, "UserName");改为result.AddFields(request, "UserName", "Age");
SearchByPage中增加过滤条件:
1 protected override void SearchByPage(int page) 2 { 3 int age = 0; 4 if(!Int32.TryParse(Age, out age)) Age = string.Empty; 5 // 过滤 6 Members = Members.Where(UserName, entity => entity.UserName.Contains(UserName)) 7 .Where(Age, entity => entity.Age == age); 8 // 分页 9 Members = Pager(Members.OrderBy(entity => entity.UserName)); 10 }
完整的SearchModel.cs文件:
修改View:
在Index.cshtml查询的表单中增加查询条件:
@Html.TextBoxFor(model => model.Age, new { @class = "span2 search-query" })
完整的Index.cshtml文件:
就可以了,应该是挺方便了
完整项目文件下载: