用EF Code First和ASP.Net MVC3進行類層級模型驗證

來源:互聯網
上載者:User

你能應用驗證屬性attribute)—— 如.NET 4內建的[Required],[Range]—— [RegularExpression] 到你的模型類中,從而保證儲存到資料庫之前模型屬性的有效性得到驗證。你也能產生你自己的定製驗證屬性像這個比較酷的[CreditCard]validator)並將他們通過EF Code First自動強制實施。這是一個在你的模型中驗證屬性值的簡單方法。我在我之前的部落格展示了這種操作的一些範例程式碼。

使用IValidatableObject實施類層級模型驗證

資料註解屬性供了一種簡單的方法來驗證你的模型類中的單個屬性值。

有些人問道:是否EF Code First也支援在模型對象上應用類層級驗證方法,只管驗證規則而不需要涉及很多屬性值? 答案是肯定的——你有一個很簡單的方法來實現:在你的模型類中實現IValidatableObject介面。

IValidatableObject.Validate()方法

下面是一個在Product模型類中使用IvalidatableObject介面(包含於.NET4的System.ComponentModel.DataAnnotaions命名空間內)實現兩個定製驗證規則的樣本。這兩個規則保證:

· 如果產品(product)處於斷貨狀態,新單品(Unit)不能被訂購

· 如果庫存超過100 Unit,新單品(Unit)不能被訂購

我們將通過實現我們的Product 類中的IValidatableObject介面和它的Validate()方法來強制實施這些商業規則,像這樣:

IValidatableObject.Validate()方法能應用涉及多個屬性的驗證規則,並返回多方個驗證錯誤。每個返回的驗證結果都提供一個錯誤訊息和一個導致驗證衝突的候選屬性名稱列表(這對顯示UI內的錯誤資訊非常有用)。

強制自動驗證

在實現了IvalidatableObject介面的模型對象被儲存的時候,EF Code First(自CTP5起)現在會自動調用Validate()方法。你無需寫任何代碼來實現它——現在這個是預設支援的。

這個新支援意味著下面違反了上面所說的一條商業規則的代碼將在我們調用Northwind.DBContext的“SaveChanges()“方法的時候自動拋出一個異常(並中止事務)。

除了相應地處理驗證異常之外,EF Code First還允許你主動檢查驗證錯誤。自CTP5開始, 你能調用DbContext基類的GetValidationErrors()方法來返回一列被處理模型對象中的驗證錯誤。GetValidationErrors()將返回所有驗證錯誤——不管他們是通過資料註解式屬性(DataAnnotation Attribute)還是通過IValidatableObjectValidate()實現產生的。

以下是一個在嘗試調用SaveChanges()前使用

GetValidationErrors()方法主動檢查錯誤的樣本:

ASP.Net MVC3和IValidatableObject

對與ASP.NET MVC的模型繫結結構一起使用的模型對象,ASP.NET MVC2支援其資料註解式屬性的自動強制實施。 ASP.Net MVC3走的更遠,它還支援IValidatableObject介面。在有驗證錯誤的時候,這個對模型驗證的綜合支援使顯示表單內的錯誤資訊變得簡單。

為了示範這個操作,讓我們研究一個簡單的允許使用者產生新product的Create視窗:

我們能使用一個包含下面2個方法的ProductController類來實現上面的兩個Create功能:

第一個Create()方法實現一種/Product/Create URL來處理HTTP-GET請求,並顯示HTML表單以供填寫。第二個Create()方法實現另一種/Product/Create URL來處理HTTP-Post請求——它取出提交的表單資料,保證它的有效性,如果有效話將其儲存在資料庫內。 如果驗證有問題,它會重新顯示表單和它提交的值。

我們的“Create”視圖(描述表單的)的Razor視圖模板類似下面這樣:

在上面的控制器視圖實現中亮點之一是我們沒有寫任何驗證邏輯在裡面。驗證邏輯和商業規則完全在我們的模型層實現,而ProductsController只通過簡單地檢查它是否有效——通過調用ModelStateIsValid Helper 方法 ——來決定是去試著儲存改動還是重新顯示帶有錯誤的表單。我們的視圖調用的

Html.ValidationMessageFor()Helper方法只簡單地顯示我們的Product模板的資料批註和IValidatableObject.Validate()方法所返回的錯誤資訊。

我們能通過在表單中輸入非法資料並嘗試提交重現以上情境。

注意上面當我們點“Create“按鈕的時候我們是怎樣得到一個錯誤資訊的。這是因為我們選中了”Discontinued“複選框的同時輸入了一個UnitsOnOrder值(所以違反了我們的商業規則中的一條)。

你可能會問:ASP.Net MVC如何知道要在UnitsOnOrder文字框旁高亮顯示錯誤資訊的?這是因為ASP.NET MVC 3在實現模型繫結的時候支援IvalidatableObject介面,它會返回其驗證失敗的錯誤資訊。

我們的產品模型類中的商業規則指定我們的商業規則被違反的時候”UnitsOnOrder”屬性必須被高亮顯示。

因為上面的屬性名稱提示,所以我們的Html.ValidationMessageFor()helper方法知道要在UnitsOnOrder編輯框旁邊顯示商業規則錯誤資訊:

保持代碼“乾燥”(DRY:Don’t repeat yourself)

ASP.NET MVC和EF Code First使你能將驗證和商業規則置於同一個地方(在你的模型層中),防止它們溜到你的控制器和視圖裡去。

在模型層放置驗證邏輯可以協助防止你在往應用程式中添加更多的控制器和視圖的時候重複驗證/商業邏輯。它允許你在一個地方(你的模型層中)快速更改你的商業規則/驗證邏輯,並立刻在你應用程式中所有的控制器/視圖中體現出來。這讓你的程式碼乾淨,容易維護,並能在將來很容易演化和升級。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.