重構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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM