EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页
在前面的教程你實施了一套基本的 CRUD 操作,為Student實體的 web 頁。在本教程中,您將添加排序、 篩選和分頁到?StudentsIndex的功能。您還將創建一個頁面,并簡單分組。
下面的插圖顯示頁面當你完成時的樣子。列標題是鏈接,用戶可以單擊要作為排序依據的列。單擊列標題,一再升序和降序之間切換。
將列排序鏈接添加到學生索引頁
若要添加排序到學生索引頁,會改變Student控制器的Index方法,將代碼添加到Student的索引視圖。
添加排序功能指數法
在Controllers\StudentController.cs,用下面的代碼替換該Index的方法:
public ActionResult Index(string sortOrder) { ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date"; var students = from s in db.Students select s; switch (sortOrder) { case "Name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "Date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList()); }這段代碼接收sortOrder參數從 URL 中的查詢字符串。由 ASP.NET MVC 作為操作方法的參數提供的查詢字符串值。該參數將是"名稱"日期",(可選) 其次是下劃線和"desc"來指定降序排序字符串的字符串。默認的排序順序升序。
第一次請求的索引頁時,那里是沒有查詢字符串。學生按升序排列顯示的LastName,這是默認值,秋天通過案switch語句所認定。當用戶單擊列標題的超鏈接時,在查詢字符串中提供了適當sortOrder值。
兩個ViewBag變量使用這樣的視圖可以使用適當的查詢字符串值配置列標題的超鏈接:
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";這些都是三元的語句。第一個指定sortOrder參數為 null 或為空,是否ViewBag.NameSortParm應設置為"name_desc";否則,應將設置為空字符串。這兩個語句使該視圖設置列標題的超鏈接,如下所示:
| Last Name升序排列 | 降序 | 升序 |
| Last Name降序 | 升序 | 升序 |
| Date升序 | 升序 | 降序 |
| Date降序 | 升序 | 升序 |
該方法使用LINQ to 實體來指定要作為排序依據的列。代碼創建IQueryable變量switch語句之前,修改在switch語句,并ToList調用后switch語句。當您創建和修改IQueryable變量時,沒有查詢發送到數據庫中。不執行查詢,直到您將IQueryable對象轉換成一個集合通過調用一種方法如ToList。因此,這段代碼結果中的單個查詢,return View的語句之前不會被執行。
添加列標題到學生的索引視圖的超鏈接
在Views\Student\Index.cshtml,將標題行的<tr>和<th>元素替換突出顯示的代碼:
<p>@Html.ActionLink("Create New", "Create") </p> <table> <tr> <th> @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm }) </th> <th>First Name </th> <th> @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm }) </th> <th></th> </tr> @foreach (var item in Model) {此代碼使用ViewBag屬性中的信息來設置適當的查詢字符串值的超鏈接。
運行此頁,然后單擊Last Name和Enrollment Date的列標題,以驗證該文獻整理工作。
單擊姓氏標題后,學生是降序顯示最后一個名稱。
向學生索引頁添加一個搜索框
若要添加篩選到學生索引頁,將會向視圖中添加一個文本框和一個提交按鈕和Index方法中做相應的修改。文本框中會讓你輸入名字和姓氏字段中搜索的字符串。
將篩選功能添加到索引方法
在Controllers\StudentController.cs,用下面的代碼 (突出顯示所做的更改) 來替換Index方法:
public ViewResult Index(string sortOrder, string searchString) { ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList()); }您已經添加到Index方法的searchString參數。您已經添加在 LINQ 語句whereclausethat 選擇只有其名字或姓氏包含搜索字符串的學生。搜索字符串值被收到一個文本框,您將添加到索引視圖。?添加where子句的語句執行只有在要搜索的值。
注在許多情況下你可以調用同一個方法,在實體框架的實體集或作為一種對內存中集合的擴展方法。結果通常都是一樣,但在某些情況下可能會有所不同。例如,Contains方法的.NET 框架實現返回的所有行時將為空字符串傳遞給它,但 SQL Server 緊湊 4.0 的實體框架提供程序都返回零行空字符串。因此 (放Where中if語句的語句) 的示例中的代碼將確保你得到相同的結果,所有版本的 SQL Server。而且在此基礎上,?Contains方法的.NET 框架實現默認情況下,執行區分大小寫的比較,實體框架 SQL Server 提供程序在默認情況下執行不區分大小寫的比較。因此,調用ToUpper方法使測試明確不區分大小寫可以確保當您更改以后要使用的存儲庫,它將返回而不是IQueryable對象IEnumerable集合的代碼結果不會改變。(當Contains調用對IEnumerable集合時,你得到的.NET 框架實現 ; 當你對IQueryable對象調用它,你得到的數據庫提供程序實現。
學生的索引視圖中添加一個搜索框
在Views\Student\Index.cshtml,添加突出顯示的代碼之前開放table標記以創建一個標題、 一個文本框和搜索按鈕。
<p>@Html.ActionLink("Create New", "Create") </p>@using (Html.BeginForm()) {<p> Find by name: @Html.TextBox("SearchString") <input type="submit" value="Search" /></p> }<table> <tr> ?運行該頁面,輸入搜索字符串,單擊搜索篩選驗證正常工作。
請注意 URL 不包含"一個"搜索字符串,這意味著如果用書簽標記此頁,你不會得到篩選后的列表,當您使用該書簽。您將更改搜索按鈕,稍后在本教程中使用查詢字符串進行篩選條件。
將分頁添加到學生index頁
要向學生索引頁添加分頁,你會開始通過安裝PagedList.Mvc?NuGet 程序包。然后你會在Index法進行其他更改和添加分頁鏈接到Index視圖。PagedList.Mvc是一個多好的分頁和排序包為 ASP.NET MVC 中,和它的使用在這里僅用作示例,不是為它在其他選項的建議。下面的插圖顯示分頁鏈接。
安裝 PagedList.MVC NuGet 程序包
NuGet?PagedList.Mvc包自動安裝PagedList軟件包,作為一種依賴。PagedList程序包安裝IQueryable和IEnumerable收藏PagedList集合類型和擴展方法。擴展方法在您IQueryable或IEnumerable,?PagedList集合中創建單個數據頁和PagedList集合提供了若干屬性和便利分頁的方法。PagedList.Mvc包安裝一個分頁的助手顯示分頁按鈕。
從工具菜單中,選擇庫程序包管理器,然后管理 NuGet 程序包的解決方案.
在管理 NuGet 程序包對話框中,單擊聯機選項卡在左邊,然后在搜索框中輸入"paged"。當你看到PagedList.Mvc包時,單擊安裝.
在選擇項目框中,單擊確定.
將分頁功能添加到索引方法
在Controllers\StudentController.cs,添加PagedList命名空間的using語句:
using PagedList;用下面的代碼來替換Index方法:
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page) { ViewBag.CurrentSort = sortOrder; ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; if (searchString != null) { page = 1; } else { searchString = currentFilter; } ViewBag.CurrentFilter = searchString; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: // Name ascending轉載于:https://www.cnblogs.com/178mz/p/4262358.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何定制Activity的标题栏
- 下一篇: poj 2449