天天看點

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

上一篇文章實作Student 基本的實體CRUD操作。本文将展示如何Students Index頁添加排序、篩選和分頁功能。

以下是排序完成時、經過篩選和分頁功能截圖,您可以在列标題點選排序。

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

要為Students Index頁面加入排序功能,你須要改動Student controller的Index方法,并為Student Index視圖加入代碼。

打開Controllers\StudentController.cs,使用以下的代碼替換Index 方法

"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);

case "date_desc":

students = students.OrderByDescending(s => s.EnrollmentDate);

default:

students = students.OrderBy(s => s.LastName);

}

return View(students.ToList());

上面的代碼接收URL中的查詢字元串作為sortOrder參數。該參數是"Name"或"Date"。使用三元運算符推斷并加下劃線和"desc"來指名這是一個降序排序,預設是按升序排序。

第一次訪問Index頁面時是沒有查詢字元串的,students依照LastName作升序排序顯示。這是由switch語句中的default指定的。當使用者點選某列的标題連結時,URL的查詢字元串中就含有了對應的sortOrder值。

這裡使用了兩個ViewBag變量以便視圖能夠将合适的查詢字元串提供給列标題連結。

"name_desc" : "";

ViewBag.DateSortParm = sortOrder == "Date" ?

這裡使用了三元運算符,上面第一個指明假如sortOrder參數為null或為空。則ViewBag.NameSortParm被指派為"name_desc"。否則将其指派為空。其排序規則為:

Current sort order

Last Name Hyperlink

Date Hyperlink

Last Name ascending

descending

ascending

Last Name descending

Date ascending

Date descending

該方法使用LINQ to Entities來指明要排序的列,上面的代碼在switch語句前建立了一個 IQueryable變量,然後在switch中改動它,最後在switch語句後調用ToList方法。當你建立并改動IQueryable變量時,并沒有向資料庫發送查詢指令,直到調用ToList方法将IQueryable 對象轉換為一個集合時才真正的運作查詢指令。是以,直到return View語句,才會運作查詢語句。

作為還有一種為每個排序編寫不同的LINQ語句的替代方法。能夠使用動态建立LINQ句。

打開Views\Student\Index.cshtml,加入以下的代碼

上面的代碼使用ViewBag屬性使用對應的查詢字元串來設定列标題連結的值。

執行項目,點選Last Name和Enrollment Date行标題,驗證排序功能

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

點選Last Name标題。students 将按降序排列

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

要在Students Index頁面中加入搜尋功能,你須要在視圖中加入一個文本框和一個送出button并改動Index方法,通過在文本框中輸入 first name或者last name 來搜尋對應的Students資料。

打開Controllers\StudentController.cs,使用以下的代碼替換Index方法

if (!String.IsNullOrEmpty(searchString))

students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())

|| s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));

上面的代碼将searchString參數加入到Index方法。你也能夠向LINQ語句中加入where子句來查詢那些first name 或者 last name中包括查詢條件的student。

查詢條件就是你所填寫在Index視圖的文本框中的字元串,僅僅有當文本框中由查詢條件時。where語句才會運作。

注意:在非常多情況下,你能夠調用不管該是Entity Framework實體集中的方法還是位于記憶體集合中的作為擴充的方法,得到的結果一般是一樣的,可是有些情況下可能不同。

舉例來說。.NET Framework實作了Contains方法,當你向該方法傳遞一個空字元串作為參數時,它将傳回全部行,可是在SQL Server Compact 4.0的  Entity Framework提供程式中不反回不論什麼行,是以上面的代碼(将where語句放在if語句中)能夠確定全部SQL Server版本号都能傳回同樣的結果。另外,.NET Framework實作的Contains方法預設是大寫和小寫敏感的,可是Entity Framework SQL Server 提供程式運作的比較是不區分大寫和小寫的。

是以。此處調用ToUpper方法來明白這裡運作不區分大寫和小寫的比較,這樣當接下來使用倉儲模式時不須要改動代碼就能夠得到同樣的結果(IEnumerable集合中的Contains方法是由 .NET Framework實作的,IQueryable對象中的Contains方法是由資料庫提供程式實作的)。

對于不同的資料庫提供程式或者使用IQueryable對象作比較或者使用IEnumerable集合作比較時,Null值得處理也是不同的。比如某些情況下,where條件比方table.Column !=0可能不傳回那些包括null值得列。

打開Views\Student\Index.cshtml,加入例如以下代碼

執行項目。輸入要搜尋的值,點選Search驗證搜尋功能是否正常

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

注意在URL中并不包括搜尋字元串,這意味着假設你将此頁面增加書簽,然後通過書簽來打開此頁面。你将無法得到篩選後的結果。

要向Students Index頁面中加入分頁,你須要安裝PagedList.Mvc NuGet包。然後你能夠在Index 方法中做一些改動并在Index視圖中加入分頁連結。PagedList.Mvc是ASP.NET MVC中衆多分頁和排序包中比較好的一個。這裡僅僅是使用它來作為示範,并不是作為推薦選擇。

PagedList包作為PagedList.Mvc包的依賴項會自己主動安裝到項目中。PagedList包為IQueryable和IEnumable集合加入了PagedList集合類型和擴充方法。

PagedList擴充方法為從IQueryabl或IEnumable集合産生的PagedList集合資料建立了一個單一的頁面。而且PagedList集合提供了多個便于分頁的屬性和方法。PagedList.Mvc包中含有分頁幫助器并可在頁面中顯示分頁button。

依次打開Tools-> Library Package Manager-> Package Manager Console

在打開的Package Manager Console中確定Package source是nuget.org 而且Default project是 ContosoUniversity,最後輸入Install-Package PagedList.Mvc指令

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

打開Controllers\StudentController.cs,加入PagedList命名空間

使用以下的代碼替換Index方法

if (searchString != null)

page = 1;

else

searchString = currentFilter;

ViewBag.CurrentFilter = searchString;

default: // Name ascending

int pageSize = 3;

int pageNumber = (page ??

1);

return View(students.ToPagedList(pageNumber, pageSize));

上面的代碼加入了一個page參數,一個目前排序順序參數,一個目前搜尋條件參數

頁面第一次顯示或者使用者還沒有點選分頁或排序連結。全部參數值都為null。假設點選分頁連結,page變量将包括要顯示的頁碼。

ViewBag屬性向視圖提供了目前的排序順序,由于在點選分頁連結後必需要保持目前的排序順序。

還有一個屬性ViewBag.CurrentFiler向視圖提供目前的搜尋條件。該值必需要被包括在分頁連結中以保證是針對搜尋結果進行分頁。同一時候在頁面又一次顯示時,搜尋字元串必須顯示在搜尋框中。假設在分頁時改動了搜尋字元串。頁碼必需要被重置為1。由于新的搜尋條件可導緻不同的搜尋結果。當向搜尋框輸入搜尋字元串并點選送出button。這是searchString的值不為null。

在該方法的結尾部分,學生IQueryable對象的ToPagedList擴充方法将學生查詢轉換為一個支援分頁的學生集合類型,并将該學生集合傳遞給視圖

?

ToPagedList方法須要一個頁碼參數。兩個問号表示空合并操作符(null-coalescing operator)。空合并操作符為nullable 類型指定預設值,表達式(page ?? 1)表示假設page值不為空就傳回該值,否則傳回1。

打開Views\Student\Index.cshtml,使用以下的代碼替換

0 : Model.PageNumber) of @Model.PageCount

@Html.PagedListPager(Model, page => Url.Action("Index",

new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

頁面頂部的@model語句指明視圖如今擷取的是PagedList對象而不是List對象。

using PagedList.Mvc語句能夠使MVC幫助器提供分頁button。

在代碼中使用了 BeginForm 的重載方法并加入了FormMethod.Get 參數。

預設情況下BeginForm 使用POST方式送出表單資料,這意味着參數通過HTTP消息正文傳遞而不是通過URL查詢字元串。當你指定使用HTTP GET時。表單資料通過URL查詢字元串來傳遞。這樣能夠同意使用者将URL儲存為書簽。

W3C guidelines for the use of HTTP GET推薦你應該在不會更新資料的方法中使用GET方式。

搜尋框使用目前的搜尋字元串進行初始化,以便在分頁的時候不會丢失搜尋字元串。

列标題連結使用了搜尋字元串并将其傳遞給控制器以便使用者能夠對搜尋結果進行排序。

顯示目前頁碼和總頁數

假設沒有要顯示的頁。就顯示"Page 0 of 0"

PagedListPager幫助器顯示分頁button

PagedListPager幫助器提供了多個選項。你能夠自己定義URL和樣式

執行項目

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

使用不同的排序方式。并點選分頁button跳轉至不同的頁碼,確定分頁功能正常,然後輸入查詢條件,再次驗證分頁和搜尋功能正常。

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

要讓About頁面顯示在每個入學日共同擁有多少學生登記,須要将學生分組并進行簡單的計算,要做到這些。須要運作下列操作:

須要為要傳遞給視圖的資料建立一個視圖模型類

改動Home控制器中的About方法

改動About視圖

建立一個ViewModels目錄并加入名為EnrollmentDataGroup.cs的類,使用以下的代碼替換

打開HomeController.cs,在檔案頂部加入using語句引入命名空間

為資料庫上下文加入類變量

使用以下的代碼替換About方法

使用LINQ語句對Student實體依照enrollment date分組。計算每一個分組的實體數量,并将結果存儲在EnrollmentDateGroup視圖模型對象的集合中。

加入Dispose方法

打開Views\Home\About.cshtml ,使用以下的代碼替換

執行項目,點選About連結。顯示學生統計資訊

MVC5 Entity Framework學習參加排序、篩選和排序功能1.為 Students Index頁面加入列排序連結2.向Students Index頁面加入搜尋框3.建立顯示學生統計資訊的About頁面

還大家一個健康的網絡環境,從你我做起

THE END

<b>本文轉自mfrbuaa部落格園部落格,原文連結:</b><b>http://www.cnblogs.com/mfrbuaa/p/4867743.html</b><b>,如需轉載請自行聯系原作者</b>