简短的问题 - 您如何定义视图模型?为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