在本節中將會給Movie
模型添加驗證邏輯。而且確保這些驗證規則在用戶建立或編輯電影時被執行。html
ASP.NET MVC 的核心設計信條之一是DRY: "不要重複本身(Don’t Repeat Yourself)"。ASP.NET MVC鼓勵您指定功能或者行爲,只作一次,而後將它應用到應用程序的各個地方。這能夠減小您須要編寫的代碼量,並減小代碼出錯率,易於代碼維護。jquery
給ASP.NET MVC 和 Entity Framework Code First 提供驗證支持是 DRY 信條的一次偉大實踐。您能夠在一個地方 (模型類) 中以聲明的方式指定驗證規則,這個規則會在應用程序中的任何地方執行。git
讓咱們看看您如何在本電影應用程序中,使用此驗證支持。github
您將首先向Movie
類添加一些驗證邏輯。web
打開Movie.cs文件。在文件的頂部添加using
語句,從而引用System.ComponentModel.DataAnnotations
命名空間:正則表達式
using System.ComponentModel.DataAnnotations;
注意,該命名空間不包含System.Web
。DataAnnotations 提供了一組內置的驗證特性,您能夠以聲明的方式,應用於任何類或屬性。數據庫
更新Movie
類,以利用內置的Required
、 StringLength
和Range
驗證屬性。如下面的代碼爲例,以應用驗證屬性。express
?瀏覽器
運行該應用程序,您會再次獲得瞭如下的運行時錯誤:服務器
The model backing the 'MovieDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
咱們將使用Migrations來更新 Schema。生成解決方案,而後打開軟件包管理器控制檯窗口,並輸入如下命令:
add-migration AddDataAnnotationsMig
update-database
當此命令完後,Visual Studio會打開指定名稱 (AddDataAnnotationsMig)的文件,其中定義了派生自DbMIgration
的新類,並在Up
方法中,您能夠看到代碼更新的Schema 和約束條件。Title
和Genre
字段再也不能夠爲 null (即,您必須輸入一個值) 而且Rating
字段具備最大長度是 5。
驗證屬性將指定一個驗證行爲,這樣您能夠指定模型中的那個屬性須要被強制驗證。Required屬性指示該屬性必須有一個值 ,在此示例中,一部電影必需要有Title
、 ReleaseDate
、Genre
和Price
屬性的值,這樣纔有效。Range
屬性限制了一個指定範圍內的值。StringLength
屬性容許您設置一個字符串屬性的最大長度和其最小長度(可選)。內部類型 (例如decimal, int, float, DateTime
)默認是必須的,因此不須要Required
屬性。
Code First 確保您在模型類上所指定的驗證規則,會在應用程序修改數據庫以前執行。例如,下面的代碼在調用SaveChanges
方法時,將引起異常,由於缺失幾個必需的Movie
屬性值,而且價格爲零 (這在有效範圍以外)。
驗證規則會自動被 .NET Framework執行,這將有助於使您的應用程序更加的可靠。它還確保你不會由於忘了驗證,無心中使得壞的數據也寫入到了數據庫。
下面是更新後的Movie.cs文件的完整代碼清單:
從新運行應用程序,瀏覽 /Movies的 URL。
單擊Create New連接,來添加一部新電影。在窗體中填寫一些無效值,而後單擊Create按鈕。
注意,爲了使jQuery支持使用逗號的非英語區域的驗證 ,須要設置逗號(",")來表示小數點,你須要引入globalize.js而且你還須要具體的指定cultures/globalize.cultures.js文件 (地址在https://github.com/jquery/globalize) 在 JavaScript 中可使用 Globalize.parseFloat
。下面的代碼展現了在"FR-FR" Culture下的Views\Movies\Edit.cshtml 視圖:
爲了使用這種用戶驗證界面,真正的好處是,您不須要修改MoviesController
類或Create.cshtml視圖中的任何一行代碼。在本教程以前所生成的控制器和視圖中,Movie
模型類的屬性上所指定的驗證規則同樣能夠自動適用。
您可能已經注意到了Title
和Genre
屬性,在字段中輸入文本或者刪除文本,是不會執行所需的驗證屬性的,直到您提交表單 (點Create按鈕)時才執行。對於字段是最初爲空 (如建立視圖中的字段) 和只有Required屬性並無其它驗證屬性的字段,您能夠執行如下操做來觸發驗證:
1. Tab into the field.
2. Enter some text.
3. Tab out.
4. Tab back into the field.
5. Remove the text.
6. Tab out.
上面的順序將觸發必需的驗證,而並不須要點擊提交按鈕。在不輸入任何字段的狀況下,直接點擊提交按鈕,將觸發客戶端驗證。直到沒有客戶端驗證錯誤的狀況下,表單數據纔會發送到服務器。您能夠在服務器端HTTP Post 方法上加上斷點來測試一下,或者使用Fiddler tool或 IE 9 F12 Developer tools.
您可能很想知道驗證用戶界面在沒有更新控制器或視圖代碼的狀況下是如何生成的。下面列出了MovieController
類中的Create
方法。它們是以前教程中自動生成的,並無修改。
第一種(HTTP GET)Create
方法用來顯示初始的建立form。第二個 ([HttpPost]
) 方法處理form的請求。第二種Create
方法 (HttpPost
版本) 調用 ModelState.IsValid
來檢查是否有的任何的Movie驗證錯誤。調用此方法將驗證對象上全部應用了驗證約束的屬性。若是對象含有驗證錯誤,則Create
方法會從新顯示初始的form。若是沒有任何錯誤,方法將保存信息到數據庫。在咱們的電影示例中,咱們使用了驗證,當客戶端檢測到錯誤時,form不會被post到服務器;因此第二個Create方法永遠不會被調用。若是您在瀏覽器中禁用了 JavaScript,客戶端驗證也會被禁用,HTTP POST Create
方法會調用 ModelState.IsValid來檢查影片是否含有任何驗證錯誤。
您能夠在HttpPost Create
方法中設置一個斷點,當客戶端驗證檢測到錯誤時,不會post form數據,因此永遠不會調用該方法。若是您在瀏覽器中禁用 JavaScript,而後提交具備錯誤信息的form,斷點將會命中。您仍然獲得充分的驗證,即便在沒有 JavaScript的狀況下。下圖顯示瞭如何禁用 Internet Explorer 中的 JavaScript。
下圖顯示瞭如何在火狐瀏覽器中禁用 JavaScript。
下圖顯示瞭如何在 Chrome 瀏覽器中禁用 JavaScript。
下面是框架代碼在以前的教程中生成的Create.cshtml視圖模板。它用來爲以上兩個操做方法來顯示初始的form,同時在驗證出錯時來從新顯示視圖。
請注意,代碼如何使用Html.EditorFor
helper 輸出爲Movie
中的每一個屬性的<input>
元素。此Helper旁邊是對Html.ValidationMessageFor
方法的調用。這兩個Helper方法將處理由控制器傳遞到視圖的模型對象(在這裏是,Movie
對象)。它們會自動查找模型中指定的驗證屬性,並顯示適當的錯誤消息。
若是您想要在後面更改驗證邏輯,您能夠作在一個地方,將驗證信息添加到模型上。 (此示例中,是movie
類)。您沒必要擔憂不符合規則 ,驗證邏輯會在應用程序的不一樣部分執行――在一個地方定義驗證邏輯將會被使用到各個地方。這使代碼很是乾淨,並使它易於維護和擴展。它意味着您會徹底遵照DRY原則。
打開Movie.cs文件並查看Movie
類。System.ComponentModel.DataAnnotations
命名空間提供了內置的驗證特性集的格式屬性。咱們已經爲發佈日期和價格字段應用了DataType
枚舉值。下面的代碼示例了ReleaseDate
和Price
屬性與相應的DisplayFormat
屬性。
DataType
屬性不是驗證特性,它們用來告訴視圖引擎如何Render HTML 。在上面的示例中, DataType.Date
屬性將影片日期顯示爲日期,例如,下面的DataType
屬性不會驗證數據的格式:
[DataType(DataType.EmailAddress)] [DataType(DataType.PhoneNumber)] [DataType(DataType.Url)]
上面列出的屬性只提供視圖引擎來顯示數據的格式(如:<a> 爲 URL ,< href="mailto:EmailAddress.com"> 爲電子郵件。您可使用正則表達式屬性來驗證數據的格式。)
另外一種使用DataType
屬性的方式,您能夠顯式設置DataFormatString
。下面的代碼示例了具備一個日期格式字符串的Release Date屬性 (即"d")。
[DisplayFormat(DataFormatString = "{0:d}")] public DateTime ReleaseDate { get; set; }
下面的代碼設置Price
屬性爲貨幣格式。
[DisplayFormat(DataFormatString = "{0:c}")] public decimal Price { get; set; }
完整的Movie
類以下所示。
運行該應用程序並瀏覽到Movies
控制器。很好的格式化了發佈日期和價格。下圖顯示了Release Date和使用 "FR-FR" Culture 的Price。
下圖爲默認Culture的顯示(English US) 。
在下一部分,咱們先會看看代碼,而後再改進一下自動生成的Details
和 Delete
方法。有了本節介紹的內容,相信你們已經掌握了給數據模型添加校驗器的方法。後面你們在進行MVC開發時,一方面能夠運用本節知識,一方面也能夠藉助一些開發工具。ComponentOne Studio ASP.NET MVC 是一款針對 MVC 平臺的控件包,能提供從桌面到移動設備的用戶體驗。
--------------------------------------------------------------------------------------------------------------------
譯者注:
本系列共9篇文章,翻譯自Asp.Net MVC4 官方教程,因爲本系列文章言簡意賅,篇幅適中,從一個示例開始講解,全文最終完成了一個管理影片的小系統,很是適合新手入門Asp.Net MVC4,並由此開始開發工做。9篇文章爲:
1. Asp.Net MVC4 入門介紹
・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/01/2749906.html
2. 添加一個控制器
・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/02/2751015.html
3. 添加一個視圖
・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/06/2756711.html
4. 添加一個模型
・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/12/17/2821495.html
5. 從控制器訪問數據模型
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2013/01/11/2855935.html
6. 驗證編輯方法和編輯視圖
・ 譯文地址:http://www.cnblogs.com/powertoolsteam/archive/2013/01/24/2874622.html
7. 給電影表和模型添加新字段
・ 譯文地址:http://powertoolsteam.blog.51cto.com/2369428/1140334
8. 給數據模型添加校驗器
・ 譯文地址:http://powertoolsteam.blog.51cto.com/2369428/1147449
9. 查詢詳細信息和刪除記錄
・ 譯文地址:http://powertoolsteam.blog.51cto.com/2369428/1149311
10.第三方控件Studio for ASP.NET Wijmo MVC4 工具應用