天天看點

【譯】ASP.NET MVC 5 教程 - 10:添加驗證

在本節中,我們将為Movie模型添加驗證邏輯,并确認驗證規則在使用者試圖使用程式建立和編輯電影時有效。

ASP.NET MVC 的一個核心原則是DRY(Don't Repeat Yourself - 不做重複的事情)。ASP.NET MVC 鼓勵你一次性的指定功能或行為,然後應用程式的其它地方通過映射得到它,這樣一來就減少了大量的代碼,進而減少了出錯誤的可能性,并且更易于維護。

ASP.NET  MVC  和 Entity Framework Code First 提供的驗證能是 DRY 原則的不錯的實踐。你可以在一處(在模型類中)定義驗證規則,進而在應用程式中的所有地方都可以使用這個規則。

接下來讓我們看看如何在現在的Movie 中添加進階的驗證規則吧。

現在我們開始為Movie類添加一些驗證規則。

打開檔案 Movie.cs,注意命名空間 System.ComponentModel.DataAnnotations 并不包含 System.Web。DataAnnotations 提供了内置的驗證特性,你可以将它們用在任何類或屬性中(它還包含了像DataType這樣的格式化的特性,它們不參與任何驗證)。

為Movie類添加一些内置的驗證規則,修改後的代碼如下:

使用資料遷移來更新資料庫結構。編譯解決方案,然後打開“程式包管理器控制台”視窗,執行下面的指令:

<code>add-migration DataAnnotations update-database</code>

當這兩個指令執行完成之後,Visual Studio 為我們建立了 DataAnnotations 類,它繼承自 DbMigration。打開檔案,在它的Up方法中,你會看到更新結構的代碼:

從代碼中可以看出,Title、Genre和Rating三個字段不再允許為空(這意味着你必須輸入一個值)。Rating 字段的最大長度為5,Title 的最大長度為60,最小長度為3。

Code First 確定在儲存到資料庫的時候使用你指定的規則對資料進行驗證,例如,下面的代碼在調用SaveChanges的時候會抛出一個錯誤:

驗證規則在儲存的時候自動生效使得程式變得更為健壯,它可以在是你忘記去驗證,而在不經意間阻止不合法的進入資料庫。

運作應用程式,浏覽位址 /movies,點選“Create New”連結添加一個電影。如果我們在輸入過程中出現一些不合法的資料,用戶端将會顯示一些錯誤,這是通過 jQuery 用戶端驗證來實作的。下面是一些錯誤資訊:

當出現錯誤的時候,文本框會被加上紅色的邊框,并且會顯示一段錯誤描述資訊。這些錯誤資訊可以在用戶端(使用Javascript 和 jQuery)和伺服器(當用戶端Javascript無效時)段生效。

一個真正的好處是,你不需要在MoviesController 或 Create.cshtml 中修改一行代碼來啟用用戶端驗證,控制器和視圖會根據我們之前定義在Movie類中的驗證特性自動選擇驗證規則。

表單資料出現錯誤的時候不會被送出到伺服器端。

你可能會覺得奇怪,用戶端驗證是如何在沒有修改控制器或視圖代碼的情況下生成的。下面的代碼顯示了MovieController的Create方法,它和我們前面的教程中的Create代碼一樣,并沒有經過修改:

第一個Create方法顯示一個表單,第二個Create方法用來處理POST請求送出的表單資料。第二個Create方法調用ModelState.IsValid來檢查movie資料是否存在驗證錯誤,調用這個方法來檢查驗證規則,如果存在錯誤,Create 方法将會重新顯示這個表單,如果沒有,則會将Movie資料儲存到資料庫。在我們的例子中,當驗證出現錯誤的時候表單不會送出到伺服器,第二個Create方法将不會調用。如果你禁用了Javascript用戶端驗證,第二個Create方法則會調用ModelState.IsValid對資料進行檢查。

你可以通過在HttpPost Create 方法中添加斷點來監視是否被調用。當用戶端出現錯誤的時候表單将不會送出,如果我們禁用用戶端的Javascript,表單将錯誤的資料送出到伺服器,斷點将會跟蹤到。下面我們介紹一下如何在IE和Google浏覽器中禁用Javascript。

打開Internet選項,在安全選項中選中“本地Intranet”,點選“自定義級别”按鈕:

在火狐(FireFox)中禁用Javascript:

在Google Chrome 中禁用Javascript:

下面是 Create.cshtml 視圖的代碼,它被控制器中的Create方法用來顯示初始的form表單,或在發生錯誤時重新顯示帶錯誤資訊的表單資料。

打開檔案Movie.cs,檢查Movie類,System.ComponentModel.DataAnnotations 命名空間除了一套内置的驗證特性外,還提供了格式化特性。我們已經在ReleaseDate 和Price字段用到過DataType枚舉,下面的代碼展示了ReleaseDate和Price屬性中使用的DisplayFormat特性:

DataType特性不是驗證特性,他們用來告訴試圖引擎如何繪制HTML。在上面的例子中,DataType.Date 特性使ReleaseDate顯示的時候隻顯示日期部分,而不顯示時間。下面的DataType特性不驗證資料的格式:

這些特性隻為試圖引擎格式化顯示資料時提供建議。你可以使用RegularExpression 特性連驗證資料的格式。

除了使用現成的DataType 格式化特性之外,你還可以明确指定 DataFormatString 值。下面的代碼展示了ReleaseDate屬性使用格式化字元串的情況,你可以使用它來不顯示ReleaseDate日期的時間部分:

下面的代碼将Price顯示為貨币的格式:

完整的Movie類代碼如下:

面的代碼展示了如何将特性合并在一行顯示:

在本系列的下一部分,我們将回顧整個應用程式,并對自動生成的Details 和Delete 方法做一些改進。