天天看點

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

這是微軟官方signalr 2.0教程getting started with entity framework 6 code first using

mvc 5 系列的翻譯,這裡是第三篇:排序、篩選和分頁

原文:

譯文版權所有,謝絕全文轉載——但你可以在你的網站上添加到該教程的連結。

在之前的教程中你實作了一組使用web頁面對student實體的的基本crud操作。在本教程中,您将為索引頁添加排序、篩選和分頁的功能。您還會建立一個簡單的分組頁面。

下圖顯示了當你完成本教程後的頁面截屏。使用者可以點選行标題來進行排序,并且多次點選可以讓你在升序和降序之間切換。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

要為學生索引頁添加排序功能,你需要往學生控制器中的索引方法和學生索引視圖添加代碼。

使用下面的代碼替換學生控制器的索引方法:

這段代碼從url中接收sortorder查詢字元串,該字元串是由asp.net

mvc作為參數傳遞給動作方法的。該參數将是"name"或"date"之一,這是作為升序的預設的排序規則。還可能有一條下劃線和"desc"來訓示這是一個降序排序。

索引頁面第一次請求時,沒有任何查詢字元串被傳遞,學生們按照lastname的升序排序顯示。這是switch語句中的default指定的,當使用者點選某列的标題超連結時,相應的sortorder值通過查詢字元串傳遞到控制器中。

兩個viewbag變量被用于為視圖提供合适的查詢字元串值。

這裡使用了三元選擇語句。第一個指定假如sortorder參數為null或為空,則namesortparm應設定為"name_desc",否則将其設定為空字元串。這兩個語句為視圖中列标題的超連結提供下列排序規則:

目前排序順序

last name超連結

date 超連結

last name 升序

降序

升序

last name 降序

date 升序

date 降序

該方法使用來指定要作為排序依據的列。代碼在switch語句前建立了一個

iqueryable變量,然後在switch中修改它,并在switch語句後調用tolist方法。當您建立和修改iqueryable變量時,沒有查詢被實際發送到資料庫執行。直到您将iqueryable 對象通過調用一種方法如tolist轉換為一個集合時才進行真正的查詢。是以,直到return

view語句之前,這段代碼的查詢都不會執行。

作為為每個排序順序編寫不同的linq語句的替代方法,您可以動态地建立linq句。有關動态linq的資訊,請參閱。

在views\student\index.cshtml中,使用下面的代碼替換标題行的<tr>和<th>元素。

這段代碼使用viewbag的屬性來設定超連結和查詢字元串值。

運作該頁面,點選last name和enrollment date行标題,觀察排序的變化。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

點選last name,學生排序将變為按照last name的降序排列。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

要在索引頁中增加搜尋功能,你需要向視圖中添加一個文本框及一個送出按鈕并在index方法中做相應的修改。文本框允許你輸入要在名字和姓氏中檢索的字元串。

在學生控制器中,使用下面的代碼替換index方法(高亮部分是我們所做出的修改):

您已經将searchstring參數添加到index方法,您也已經添加用于在姓名中搜尋指定字元串的linq語句。搜尋字元串是從文本框中接受的,稍後您将在視圖中添加它。隻有在搜尋字元串有值時,搜尋部分的語句才會執行。

注意:在大部分情況下,你在實體架構實體集合上或作為擴充方法去執行同一個的方法結果都是相同的,但某些情況下可能不同。 例如,.net架構中的contains方法實作為當你傳遞一個空字元串作為參數時,将傳回所有行。但實體架構的sql server compact 4.0提供程式将不傳回任何行。是以示例中的代碼(将where語句放入一個if語句中)可以確定您在所有版本的sql server都能得到相同的結果。此外,contains方法在.net架構下預設是執行區分大小寫的比較,而實體架構的sql server提供程式在預設情況下執行不區分大小寫的比較。是以我們調用toupper方法使這裡明确進行不區分大小寫的比較。這樣,将來如果您使用倉儲庫時,可以不需要進行多餘的代碼修正。那時将傳回ienumerable集合而不是iqueryable對象。(當你在ienumerable集合上調用contains方法,你将得到.net架構版的contains實作;當你在iqueryable對象上調用時,你将得到對應的資料庫提供程式的方法實作。) 當你使用不同的資料庫提供程式或使用iqueryable對象和ienumable集合比較時,空值處理也可能不同。例如,在某些情況下一個where條件比如table.column !=0可能不會傳回包含null值的行。更多的資訊,請參閱。

在views\student\index.cshtml中,在table元素之前添加下面高亮的代碼以建立一個标題、一個文本框及一個搜尋按鈕。

運作索引頁面,輸入搜尋字元串并送出,檢查搜尋功能是否正常工作。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

注意該url中并不包含搜尋字元串,這意味着如果您将查詢結果頁面加入書簽,通過使用書簽打開該頁面将無法得到篩選後的清單結果。稍後在本教程中我們将更改搜尋按鈕改用搜尋字元串來過濾結果。

要向索引頁面添加分頁,你需要安裝pagedlist.mvc

nuget包,然後你在索引方法及視圖中進行相應的修改。pagedlist.mvc是一個很好的分頁排序包,在此我們僅使用它來進行示範,下圖顯示附加了分頁連接配接的索引頁面。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

安裝pagedlist.mvc nuget包

pagedlist包作為pagedlist.mvc包的依賴項會自動安裝到項目中。pagedlist對iqueryable和ienumable集合添加了pagedlist集合類型及相應的擴充方法。這些擴充方法讓你在使用這些集合時能友善地處理分頁功能。

在程式包管理器控制台中輸入以下指令來安裝pagedlist.mvc包

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

在學生控制器中,添加pagedlist命名空間:

使用以下代碼替換index方法:

這段代碼添加了一個page參數,一個目前排序順序參數,添加了一個目前篩選參數到方法簽名中:

頁面第一次顯示時,或者使用者還沒有點選分頁或排序連結,所有參數都為null。如果點選分頁連結,page變量将包含要顯示的頁面編号。

一個viewbag屬性被提供給視圖用于訓示目前的排序順序,因為在點選了分頁連結後必須要保持目前的排序順序才能正确的對結果進行分頁。

另一個屬性viewbag.currentfiler被提供給視圖用于訓示目前的搜尋字元串,分頁連接配接同樣必須包含此值以保持針對搜尋結果進行分頁。同時字元串還必須還原到搜尋框中。如果在分頁的過程中修改了搜尋字元串,頁碼被重置為1,因為新的搜尋字元串可能會導緻不同的搜尋結果集合。這一改變是在文本框中輸入值并送出時。在這種情況下,searchstring參數不為空。

在方法的結尾,學生iqueryable對象的topagedlist擴充方法将學生查詢轉換為一個包含了單頁的支援分頁的集合類型。該學生集合的單頁被傳遞給視圖用于顯示:

topagedlist方法需要一個頁碼,兩個問号表示null合成運算符,null合成運算符定義了可為空類型的預設值。在本例中,如果page的值不為空,則傳回該值,如果page的值為空,則傳回1。

在views\student\index.cshtml中,使用下面的代碼替換原來的,高亮部分顯示了我們所做的更改:

頁面頂部的@model語句訓示視圖現在擷取pagedlist對象而不是list對象。

pagedlist.mvc的using語句使mvc幫助器可以使用pagedlistpager擴充方法來生成分頁按鈕。

下面的代碼使用了指定了formmethod.get的beginform的重載。

預設情況下表單使用post方式送出資料,這意味着參數使用http消息體傳遞,而不是url。當你指定使用http

get時,表單資料通過url來傳遞,這樣使用者就可以建立該url的書簽并重複使用。推薦你在不會導緻結果更新時使用get方式來進行操作。

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

清單器連結使用查詢字元串将目前的搜尋字元串傳遞給控制器,以便使用者可以對搜尋結果進行排序:

顯示目前頁數和總頁數。

如果沒有要顯示的頁,則顯示"page 0 of 0"。(在這種情況下頁面數字會大于總頁數,因為pagenumber是1,而pagecount是0)

由pagedlistpager幫助器顯示分頁按鈕:

pagedlistpager幫助器提供了很多選項,您可以自定義url及樣式,更多的資訊請參閱。

運作頁面。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

點選不同的排序順序,并跳轉到不同的頁碼,然後輸入搜尋字元串,并再次分頁并驗證排序及搜尋過濾還可以正常工作。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁
[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

為contoso大學的關于頁面添加每日有多少個學生注冊,需要用到分組及簡單的計算,要做到這些,您需要執行下列操作:

建立一個viewmodel用來傳遞資料給視圖

修改home控制器中的about方法

修改about視圖

在項目檔案夾中建立一個viewmodels檔案夾,在該檔案夾中添加一個新類,命名為enrollmentdatagroup.cs,使用下面的代碼替換自動生成的:

在home控制器中,在檔案的頂部添加以下using語句:

在類定義後添加資料庫上下文的類變量:

使用下面的代碼替換about方法:

使用linq對學生實體按照注冊日期進行分組,計算每個分組的實體數量并将結果存儲在enrollmentdategroup視圖模型對象的集合中。

添加dispose方法:

将about.cshtml替換為如下代碼:

運作程式,點選關于連結,你可以看到學生的統計資訊了。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

到目前為止,你已經實作了基本的crud和排序、篩選、分頁及分組功能,下一節中我們将通過擴充資料模型來介紹更進階的主題。

[渣譯文] 使用 MVC 5 的 EF6 Code First 入門 系列:排序、篩選和分頁

  tom dykstra - tom

dykstra是微軟web平台及工具團隊的進階程式員,作家。