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脚本引用:
_Layout.cshtml查询页面(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)
Html.Pager的源代码定义查询表单:
@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的源代码:
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为空,则不进行条件过滤,且能链式调用
扩展Where函数PagerSearchBase.cs基类
PagerSearchBase.csMember.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文件:
SearchModel.cs修改View:
在Index.cshtml查询的表单中增加查询条件:
@Html.TextBoxFor(model => model.Age, new { @class = "span2 search-query" })
完整的Index.cshtml文件:
Index.cshtml就可以了,应该是挺方便了
完整项目文件下载:
