2011-06-09 150 views
3

當在WPF MVVM中查找用於做屬性驗證的最佳實踐的教程時,我看到很多人使用接口IDataErrorInfo我只是想知道是否可以像ASP.Net MVC中使用屬性一樣設置自動驗證?MVVM模型驗證和數據綁定?

任何人都可以獲取MVVM中模型驗證的最佳實踐嗎?驗證應該在基礎模型類上嗎?或在視圖模型類?

回答

3

Silverlight有一個控件調用該作品使用DataAnnotations屬性,有人還跟port that control to WPF數據形。我相信這符合你所尋找的東西。

1

我的看法是,驗證應在視圖模型,而不是模型,因爲:

  • 驗證是不正確的輸入 和UI的第一個邏輯點 視圖模型。這是很好的做法, 驗證,並在 視圖模型結束請求,而不是跨無效 數據發送到型號
  • 還很多時候模型是傳統和假設是,他們 不能修改。 ViewModel創建了 一個很好的包裝模型。

如果您使用任何依賴注入工具來處理像Unity,Windsor Castle等應用程序,則可以使用攔截器來驗證ViewModels。在調用ViewModel方法之前先調用攔截器。

使用攔截器與城堡的一個例子可以在這裏找到 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html

2

這些都是很好的問題!驗證屬於Model和ViewModel(s)。下面是我通常的做法:

首先,我儘可能多地在模型中進行了驗證 - 這些將是獨立於給定演示文稿的規則。例如,如果您的域中的員工沒有EmployeeNumber屬性不爲空,並且長度爲六個字符,並且六個字符中的每個字符都必須是數字,則該員工無效。

其次,我有一個實現IDataErrorInfo的基礎ViewModel類。在這個基類中,我基本上詢問模型是否有效,如果不是,則會觸發錯誤(由於IDataErrorInfo而易於轉換爲視圖)。我也使IDataError信息虛擬的實現方法,因爲...

最後,將會有給定演示文稿獨特的邊緣案例,該模型無法捕獲。對於一個(人爲的)例子,假設你有一個演示文稿,如果只輸入了他的名字和姓氏,那麼僱員是有效的,另一個演示文稿需要中間的首字母。儘管您當然可以並且應該在Employee中擁有FullName組件/ valueObject屬性以驗證該屬性不爲null,但您需要每個演示文稿的子類ViewModel,以瞭解在這種情況下,Fullame屬性的用戶條目是否有效。

最後,你可以也應該爲模型驗證使用驗證器 - 我喜歡NHibernateValidator,但肯定還有其他(非常)好的可用。其中大部分,包括NHibernate的,都會支持你正在尋找的屬性驗證。然而,我更喜歡清潔的替代屬性,因此我在驗證器中爲單獨的項目(即MyDomainImpl)設置了所有驗證規則。在模型中噪音更少的清潔劑,以及更清晰的關注點分離。

如果您需要,隨時提出問題也給自己一些工作時間,直到你有一個適合你的方法 - 這是而不是一個小問題。

HTH,
Berryl

1

如果把驗證邏輯?

軟件系統大多需要驗證某種 以確保 業務邏輯必須處理僅 正確的數據。這些驗證 規則由業務 模型定義,因此域圖層是 實施它們的正確位置。只要 請記住,你不要開始 重複 業務對象之間的驗證碼。

link

您可能會感興趣的WPF Application Framework (WAF)的示例應用程序。他們演示瞭如何將.NET DataAnnotations驗證屬性與MVVM模式一起使用。