2010-03-02 76 views
0

簡短的問題 - 您如何定義視圖模型?爲MVC/MVP定義視圖模型

這裏有一些選擇:

  1. 通過實際的模型到視圖中。
  2. 通過參考模型創建視圖模型(如Model.Product)
  3. 使用模型中需要的屬性創建視圖模型,並從模型中設置這些模型。
  4. 可能還有更多。

各有各的優缺點。

你有什麼經驗 - 好與壞?並且您是否使用GET/POST的相同模型?

感謝您的輸入!

回答

1

基本上 - 這是關於分離責任。

更多你分開他們 - 更詳細,複雜但更易於理解它。


型號:

public class foo{ 
    string Name{get;set} 
    Bar Bar {get;set;} 
    string SomethingThatIsUneccessaryInViews {get;set;} 
} 

public class bar{ 
    string Name {get;set;} 
} 

public class fizz{ 
    string Name{get;set;} 
} 

主講人(我承認 - 仍然沒有得到MVP的想法完全):

public someSpecificViewPresenter{ 
    fizz fizz{get;set;} 
    foo foo{get;set;} 
    necessaryThingsForWhatever[] necessaryThingsForWhatever{get;set;} 
    public void someLogicIfNeeded(){...}   
} 

魔術object2object映射&壓扁,視圖模型modelmetadata配置去這裏...

ViewModel(NB => POCOS只有容器道具。沒有邏輯應該在這裏)。

public class fooViewModel{ 
    string Name {get;set;} 
    string BarName {get;set;} 
} 

public class fizzViewModel{ 
    string Name {get;set;} 
} 

public class someSpecificView{ 
    fooViewModel foo {get;set;} 
    fizzViewModel fizz {get;set;} 
    whateverViewModel whatever {get;set;} 
} 

,並在這裏不用 「DAS幸福結局」 ......

<use viewdata="someSpecificView m" /> 

<p> 
Our foo:<br/> 
${Html.DisplayFor(x=>x.foo)} 
</p> 

<p> 
Our fizz:<br/> 
${Html.DisplayFor(x=>x.fizz)} 
</p> 

${Html.UberPaging(m.whatever.Paging)} 

是的,我使用GET/POST相同的模型。有關詳情,請參閱this


但最近 - 我正在尋找其他解決方案。 CQRS的嗡嗡聲引起我的注意。

+0

我與你在這種方法。像AutoMapper這樣的映射器可以處理從複雜模型到扁平視圖對象的扁平化。 至於CQRS,我也在研究,我認爲這使得更多的「自然」視圖對象。 – lasseeskildsen 2010-03-02 10:15:45

0

在我的項目中,它確實是一個混合。

如果我想要顯示具有Customer X詳細信息的表單,則只需將DAL Customer對象傳遞給我的視圖。爲它創建一個單獨的ViewModel真是沒用,映射它的所有屬性,然後顯示它們。這是浪費時間imho。

有時候,模型有點複雜。它們是多個查詢的結果,向它們添加了一些數據,所以在這些情況下,我創建了一個自定義ViewModel,並將模型中的必要數據添加到它。在你的情況下,它會是選項2,或者有時是3.我更喜歡通過我的模型,並不得不在我的ViewData中添加額外的10個項目。

+0

不要混合它們!這是一種痛苦!到過那裏。混合只會在開始時看起來很可愛,它會欺騙你進入噩夢! :D – 2010-03-02 09:35:15

0

我從SubSonic 3中抓取了T4模板。修改了這些模板,並添加了一些新模板。我可以運行其中的一個,它爲每個表生成3個獨立的視圖模型。然後我可以根據需要進行修改。

爲什麼三個?

  1. FormModel - 包含在用於編輯或創建的表單中顯示所需的數據。外鍵被轉換爲SelectLists。日期時間字段分成日期和時間組件。

  2. PostModel - 這是從Form Post返回的對象。 DropDownLists被髮布爲Int或同等類型。模型中只有必要的成員。

  3. DisplayModel - 用於非編輯顯示數據。

我總是在名爲Generated的子文件夾中生成這些文件。當我把它們移交給Models時,我將它們移動到Models文件夾中。它並沒有完全自動化這個過程,但是它產生了很多代碼,否則我將手工生成代碼。