簡短的問題 - 您如何定義視圖模型?爲MVC/MVP定義視圖模型
這裏有一些選擇:
- 通過實際的模型到視圖中。
- 通過參考模型創建視圖模型(如Model.Product)
- 使用模型中需要的屬性創建視圖模型,並從模型中設置這些模型。
- 可能還有更多。
各有各的優缺點。
你有什麼經驗 - 好與壞?並且您是否使用GET/POST的相同模型?
感謝您的輸入!
簡短的問題 - 您如何定義視圖模型?爲MVC/MVP定義視圖模型
這裏有一些選擇:
各有各的優缺點。
你有什麼經驗 - 好與壞?並且您是否使用GET/POST的相同模型?
感謝您的輸入!
基本上 - 這是關於分離責任。
更多你分開他們 - 更詳細,複雜但更易於理解它。
型號:
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的嗡嗡聲引起我的注意。
在我的項目中,它確實是一個混合。
如果我想要顯示具有Customer X詳細信息的表單,則只需將DAL Customer對象傳遞給我的視圖。爲它創建一個單獨的ViewModel真是沒用,映射它的所有屬性,然後顯示它們。這是浪費時間imho。
有時候,模型有點複雜。它們是多個查詢的結果,向它們添加了一些數據,所以在這些情況下,我創建了一個自定義ViewModel,並將模型中的必要數據添加到它。在你的情況下,它會是選項2,或者有時是3.我更喜歡通過我的模型,並不得不在我的ViewData中添加額外的10個項目。
不要混合它們!這是一種痛苦!到過那裏。混合只會在開始時看起來很可愛,它會欺騙你進入噩夢! :D – 2010-03-02 09:35:15
我從SubSonic 3中抓取了T4模板。修改了這些模板,並添加了一些新模板。我可以運行其中的一個,它爲每個表生成3個獨立的視圖模型。然後我可以根據需要進行修改。
爲什麼三個?
FormModel - 包含在用於編輯或創建的表單中顯示所需的數據。外鍵被轉換爲SelectLists。日期時間字段分成日期和時間組件。
PostModel - 這是從Form Post返回的對象。 DropDownLists被髮布爲Int或同等類型。模型中只有必要的成員。
DisplayModel - 用於非編輯顯示數據。
我總是在名爲Generated的子文件夾中生成這些文件。當我把它們移交給Models時,我將它們移動到Models文件夾中。它並沒有完全自動化這個過程,但是它產生了很多代碼,否則我將手工生成代碼。
我與你在這種方法。像AutoMapper這樣的映射器可以處理從複雜模型到扁平視圖對象的扁平化。 至於CQRS,我也在研究,我認爲這使得更多的「自然」視圖對象。 – lasseeskildsen 2010-03-02 10:15:45