天天看點

愛上MVC3系列~使用視圖模型的好處及與資料模型之間的指派問題

MVC開發應用程式有個問題,很多開發者不知如何去使用頁面模型,大多數開發者認為為每一個頁面去設計一個實體是多餘的,是以他們使用資料庫實體來代碼頁面視圖模型,事實上,這樣做的好處就是節省的代碼,但不好的地方是什麼呢?我來總結一下吧:

1 友善根據每一種業務邏輯和前台頁面表現,去對模型進行特性的設定

2 前台UI部分與業務層與資料庫層可以更加獨立,前台頁面模型并不依賴于資料庫模型

3 可以根據具體業務,去分别設定它們的驗證及限制關系

好了,上面我說了3點不使用viewModel的缺點,事實上,确實是這樣的,比如,你的userbase實體,如果它需要提供兩種業務,如“登陸”和“注冊”,那麼它的前台資訊展現與驗證業務肯定是不相同的,這時,如果使用ViewModel就很容易的解決了這個問題。

以下是使用者模型的代碼片斷

有了視圖模型,那我們如何去使用它呢,我們以使用者登陸為例,來說一下吧:

首先,我們定義的ViewModel裡的屬性,要求和資料模型中的屬性名稱相同,這樣友善進行模型之間的指派,使用者登陸與使用者注冊都是與userbase表相關的,

是以,在HTTPPost指向的方法時,參數可以就是UserBase類型的,看代碼:

而如果它們的屬性名稱是相同的,MVC表單在進行POST請求時,可以把屬性資訊自動填充到參數執行個體上去,但如果你的模型中包括了導航屬性(其它關系表的執行個體),則需要手動為它進行初始化,如代碼:

當我們從表單中把資料得到後,要做的是什麼呢?“驗證”,我們需要知道表單中填寫的内容是否是符合我們設定的規範,如果不符合,則傳回錯誤資訊。

在代碼中,我們并沒有出現頁面中需要的視力模型,它是如何與實體模型轉換的呢,事實上,它們之間并沒有發生轉換,隻是表單與實體之間發生了指派而以,即

隻要實體模型與視圖模型的屬性名相同,就完成可以使用MVC的自動指派功能(TryUpdateModel)。