Asp.net

ASP.NET MVC 視圖模型模式

  • September 1, 2009

編輯:我做了一些更好的東西來填充和讀取使用 ViewModels 的視圖中的數據,稱為ValueInjecter。<http://valueinjecter.codeplex.com/>

它由<http://prodinner.codeplex.com> - 一個 ASP.net MVC 範例應用程序使用

您可以在 prodinner 中看到使用 ViewModel 的最佳方式

使用 ViewModel 儲存映射邏輯並不是一個好主意,因為存在重複和 SRP 違規,但現在使用 ValueInjecter 我有乾淨的 ViewModel 和乾映射程式碼


那是舊的東西,不要使用它:

我在 asp.net mvc 中創建了一個 ViewModel 模式來編輯東西,當你必須製作一個表單來編輯實體並且你必須在表單上放一些東西時,這個模式很有用 - downs 供使用者選擇一些值

   public class OrganisationBadViewModel
   {
       //paramterless constructor required, cuz we are gonna get an OrganisationViewModel object from the form in the post save method
       public OrganisationViewModel() : this(new Organisation()) {}
       public OrganisationViewModel(Organisation o)
       {
           Organisation = o;
           Country = new SelectList(LookupFacade.Country.GetAll(), "ID", "Description", CountryKey);  
       }       
       //that's the Type for whom i create the viewmodel
       public Organisation Organisation { get; set; }
...     

   }

有幾件事困擾著我。

  1. 術語。ViewModel 在這種情況下是一個簡單的視圖數據,由控制器填充並稍後使用。View 對控制器一無所知,因為 ASP.NET MVC 基礎結構負責選擇控制器和適當的操作。控制器處理使用者互動。我認為它看起來更像被動視圖而不是 ViewModel(我假設 ViewModel 是指 Model-View-ViewModel 模式)。
  2. 細節。填充視圖數據的控制器不應該知道視圖是如何實現的細節。然而 OrganisationViewModel.Country 披露了不必要的細節(SelectListItem 是純視圖實現細節)。從而使控制器依賴於視圖實現細節。我認為應該改變它以避免它。考慮使用一些對象來保存一個國家的數據。

希望這可以幫助。

這看起來與 Wrox Professional ASP.NET MVC書中推薦的做法非常相似,該書的第一章可從上述 URL 免費獲得。

從第 100 頁開始,他們有一個關於ViewData 和 ViewModels的部分。

當 Controller 類決定將 HTML 響應呈現回客戶端時,它負責將呈現響應所需的所有數據顯式傳遞給視圖模板。視圖模板永遠不應該執行任何數據檢索或應用程序邏輯——而應該將自己限制為僅具有由控制器傳遞給它的模型/數據驅動的渲染程式碼。

[…]

當使用 [“ViewModel”] 模式時,我們創建了針對特定視圖場景進行優化的強類型類,並公開了視圖模板所需的動態值/內容的屬性。然後,我們的控制器類可以填充這些視圖優化類並將其傳遞給我們的視圖模板以供使用。這可以在視圖模板中實現類型安全、編譯時檢查和編輯器智能感知。

摘自 Rob Connery 等人編寫的由 Wrox 出版的 Professional ASP.NET MVC 1.0 的“第 1 章“書呆子晚餐””。原文可在http://tinyurl.com/aspnetmvc獲得

引用自:https://stackoverflow.com/questions/1361092