1

我使用實體框架和模型類DonationForm,由視圖模型類「CreateDonationForm」包裝。有條件的驗證MVC3模型類

爲了與DRY原則保持一致,我在Model類(而不是隻是視圖模型)上添加了驗證註釋,以便它們可以重用。然而,並非所有類的屬性都會被使用(有些實際上是相互排斥的)。例如與特定的電話號碼屬性相關時,我想使其符合正則表達式註釋並且是必需的。但是,在另一種情況下,我希望能夠提交(並向數據庫發送)空值。

下面這篇文章:How do I use IValidatableObject?

我所做的模型類實現IValidatableObject並實現自定義的驗證,以selectiely從的ValidationResult對象中刪除驗證錯誤(當字段是一個字段組考慮到不相關的部分用戶在表單上的其他選擇)。它工作,我能夠找回那些錯誤已被清除的ValidationResults列表。

但是,當我調用SaveChanges()時,出現驗證錯誤,導致無法保存。驗證仍在數據庫/模型類級別發生。 (該數據庫是使用EF 4.1 Code First從Model類生成的。)

如何獲得條件格式設置規則並仍然使用Model類上的Annotations?這基本上是說 - 應用這些驗證規則,否則不應用這些驗證規則。請在這裏指導我。我是MVC的新手,我試圖以正確的方式做事。好像將驗證放在視圖模型上,然後將值映射到底層模型類上可能會奏效;然而,它感覺不對。我認爲在Model類本身擁有驗證屬性以及在創建和更新視圖模型上放置相同註釋時存在大量浪費,重複性工作的巨大價值。感覺就像我在MVC Fw的這個應該更容易的事情。任何你可以提供的見解將不勝感激。

回答

4

有很多很酷的原則,但有時很小的違規使您的生活更輕鬆。擺脫EF模型中的數據註釋,並將它們放在您所屬的視圖模型上。您仍然可以在視圖模型中使用IValidatableObject,並組合來自多個視圖模型使用的多個可重複使用的幫助器方法的驗證(因此您仍然可以實現DRY原則)。

如果你固執,真的希望有EF模型驗證關閉驗證的EF和處理它在上層,你已經這樣做了:

dbContext.Configuration.ValidateOnSaveEnabled = false; 

EF級驗證是簡單的情況中,您的驗證規則不要在操作中改變。