2010-03-02 36 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文件夹中。它并没有完全自动化这个过程,但是它产生了很多代码,否则我将手工生成代码。