重构MVC多条件+分页解决方案
为支持MVC的验证,无刷新查询,EF,以及让代码可读性更强一点,所以就重构了下原来的解决方案。
这里就简单讲下使用方法吧:
Model:
继承PagerBase:
1 public class SearchModel : PagerBase
2 {
3 public SearchModel()
4 {
5 AddFields("UserName", "Age", "Sex");
6 }
7
8 [Required(ErrorMessage = "需要输入 用户名")]
9 public string UserName { get; set; }
10 public string Age { get; set; }
11 public string Sex { get; set; }
12
13 public IQueryable<Member> Members { get; set; }
14
15 public override void Search()
16 {
17 int age = 0;
18 if(!Int32.TryParse(Age, out age)) Age = string.Empty;
19 // 过滤
20 Members = Members.Where(UserName, entity => entity.UserName.Contains(UserName))
21 .Where(Age, entity => entity.Age == age)
22 .Where(Sex, entity => entity.Sex == Sex.Trim());
23 // 分页
24 Members = Pager(Members.OrderBy(entity => entity.UserName));
25 }
26 }
SearchModel
View:
分2种,一种是以Get形式刷新地提交查询条件的,分页可以在无刷新与刷新模式之间切换的,优化搜索引擎用的;另一种是无刷新形式提交查询条件的,分页亦是无刷新的。
这里需要将View分成2块,将数据展现的这块独立出来,便于无刷新地展示数据,所以做了个分部视图。
第一种(刷新的):
1 @model MvcPagerSearch.Models.SearchModel
2 @{
3 ViewBag.Title = "Index";
4 }
5
6 <h2>查询</h2>
7 @using(Html.BeginForm("Index", "Search", FormMethod.Get, new { @class = "form-search form-inline", id = "formMain" }))
8 {
9 <div class="input-append">
10 @Html.TextBoxFor(model => model.Age, new { @class = "span2 search-query" })
11 @Html.TextBoxFor(model => model.UserName, new { @class = "span2 search-query" })
12 @Html.TextBoxFor(model => model.Sex, new { @class = "span2 search-query" })
13 <button type="submit" class="btn">
14 快速查询</button>
15 </div>
16 <div data-valmsg-summary="true" class="text-warning"><ul></ul></div>
17 }
18
19 <div class="container">
20 <div id="pager"></div>
21 <div id="Content">
22 @Html.Partial("IndexTable")
23 </div>
24 </div>
25
26 @Url.IncludePagerScript()
27 <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
28 <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
29 <script type="text/javascript">
30 $(function () {
31 $.pager({
32 content: "#Content",
33 pager: "#pager",
34 form: "#formMain",
35 @Html.Raw(Model.Extension),
36 refresh: false
37 });
38 });
39 </script>
Index.cshtml
分页的刷新、无刷新可以通过js中的refresh: false选项来调整
数据展现的分部视图:
1 @model MvcPagerSearch.Models.SearchModel
2 <table class="table table-hover">
3 <thead>
4 <tr>
5 <th>
6 昵称
7 </th>
8 <th>
9 性别
10 </th>
11 <th>
12 年龄
13 </th>
14 </tr>
15 </thead>
16 <tbody>
17 @if(Model.Members != null)
18 {
19 foreach(var entity in Model.Members)
20 {
21 <tr>
22 <td>
23 @entity.UserName
24 </td>
25 <td>
26 @entity.Sex
27 </td>
28 <td>
29 @entity.Age
30 </td>
31 </tr>
32 }
33 }
34 </tbody>
35 </table>
IndexTable.cshtml
第二种(无刷新的):
1 @model MvcPagerSearch.Models.SearchModel
2 @{
3 ViewBag.Title = "Index";
4 }
5
6 <h2>Ajax查询</h2>
7 @using(Html.BeginForm("Index", "AjaxSearch", FormMethod.Post, new { @class="form-search form-inline", id="formMain" }))
8 {
9 <div class="input-append">
10 @Html.TextBoxFor(model => model.Age, new { @class = "span2 search-query" })
11 @Html.TextBoxFor(model => model.UserName, new { @class = "span2" })
12 @Html.TextBoxFor(model => model.Sex, new { @class = "span2" })
13 <button type="submit" class="btn">查询</button>
14 </div>
15 <div data-valmsg-summary="true" class="text-warning"><ul></ul></div>
16 }
17 <div class="container">
18 <div id="pager"></div>
19 <div id="Content">
20 @Html.Partial("IndexTable")
21 </div>
22 </div>
23 @Url.IncludeAjaxPagerScript()
24 <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
25 <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
26 <script type="text/javascript">
27 $(function () {
28 $.ajaxPager({
29 content: "#Content",
30 pager: "#pager",
31 form: "#formMain"
32 });
33 });
34 </script>
Index.cshtml
数据展现的分部视图:
1 @model MvcPagerSearch.Models.SearchModel
2 @Html.Partial("~/Views/Shared/_AjaxPagerPartial.cshtml")
3 <table class="table table-hover">
4 <thead>
5 <tr>
6 <th>
7 昵称
8 </th>
9 <th>
10 性别
11 </th>
12 <th>
13 年龄
14 </th>
15 </tr>
16 </thead>
17 <tbody>
18 @if(Model.Members != null)
19 {
20 foreach(var entity in Model.Members)
21 {
22 <tr>
23 <td>
24 @entity.UserName
25 </td>
26 <td>
27 @entity.Sex
28 </td>
29 <td>
30 @entity.Age
31 </td>
32 </tr>
33 }
34 }
35 </tbody>
36 </table>
IndexTable.cshtml
这里用到了另外个分部视图_AjaxPagerPartial.cshtml,用于记录查询条件与分页信息的。
Control:
2种方式的代码都一样:
1 public class SearchController : Controller
2 {
3 //
4 // GET: /Search/
5 TestContext testContext = new TestContext();
6
7 public ActionResult Index(SearchModel model)
8 {
9 if(ModelState.IsValid)
10 {
11 model.Members = testContext.Members;
12 model.Search();
13 }
14
15 if(Request.IsAjaxRequest()) return PartialView("IndexTable", model);
16 return View("Index", model);
17 }
18 }
SearchController.cs
源代码:http://files.cnblogs.com/nickppa/MvcPagerSearch%E9%87%8D%E6%9E%84.rar
重构MVC多条件+分页解决方案的更多相关文章
- 重构MVC多条件分页解决方案
重构MVC多条件+分页解决方案 为支持MVC的验证,无刷新查询,EF,以及让代码可读性更强一点,所以就重构了下原来的解决方案. 这里就简单讲下使用方法吧: Model: 继承PagerBase: S ...
- asp.net mvc多条件+分页查询解决方案
开发环境vs2010 css:bootstrap js:jquery bootstrap paginator 原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...
- MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页
前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点.一般的列表页面,少不了有查询条件,下面分享下Drapper+Page ...
- ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)
ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题: 浏览器安全限制了前端脚本跨站点的访问资源, ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- AspNetPager 多条件分页查询
AspNetPager 这个分页控件一般做后台基本都知道的,我就不多说了(说明与下载链接:http://www.webdiyer.com/Controls/AspNetPager),嘿嘿!其实我也是刚 ...
- 【java】spring-data-jpa 集成hibernate实现多条件分页查询
初次接触spring-data-jpa,实现多条件分页查询. 基础环境 Spring Boot+spring-data-jpa+hibernate+mysql 1.接口 要继承这个接口,这个接口提供了 ...
- asp.net MVC 常见安全问题及解决方案
asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session rid ...
- ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender
(原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人 ...
随机推荐
- 控制面板中java设置项如何删除
卸载jdk或者jre后,如果控制面板中仍然有java项,重新安装可能仍然无法设置,提示找不到"javacpl.exe" 解决办法:删除C:\windows\system32\下的j ...
- 转载:ORA-01438: 值大于为此列指定的允许精度
Number的数据声明如下: 表示 作用 说明Number(p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数 ...
- Maven学习-处理资源文件
在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来,我们来看下Maven是如果管理项目中的资源文件的. Java项目的资源文件,主要用于存储系统的配置信息,以及 ...
- 小夜灯V2.0成本
物料清单: Arduino Nano *1 17.98 HC-05主从机一体蓝牙模块 *1 15.9 RGB灯珠1W大功率带铝基板 *1 3.3 奶白灯罩 *1 32.5 锐澳9cm发光底座 *1 ...
- mysql 数据库迁移
公司的视频转码服务 使用mysql作为 任务队列, 其中mysql 是我们自己维护的 单例. 后来应业务部门建议,我们计划将现有的mysql 向dba进行迁移,以下记录一下 数据库迁移过程中的东西. ...
- Javascript 右移0位的作用
Javascript 中右移0位可以用来快速去掉小数,关于位移运算的定义: 右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位. 实际看下 ...
- Linux下select&poll&epoll的实现原理(一)
最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...
- HDFS的运行原理
简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...
- junit单元测试(keeps the bar green to keeps the code clean)
error是程序错误,failure是测试错误. junit概要: JUnit是由 Erich Gamma (设计模式的创始人)和 Kent Beck (敏捷开发的创始人之一)编写的一个回归测试框架( ...
- Axis2使war包发布为WebService
首先 吐槽下 Axis2的Eclipse插件.不好用,而且局限性大.并且添加包的过程...会及其痛苦.(懂的自然懂) 而且 发布的aar文件,不能解压缩重新打包再压缩...尝试过添加 jar包,但报错 ...