2011-06-29 135 views
0

我目前正在使用EF4和asp.net mvc 3,并且当你将这些技术结合在一起时,我肯定会遇到一些麻烦,可以通过不同类型的模型进行工作。EF4模型和MVC模型和视图模型...建模或不模型?

我有一个数据库,我已经定义,并通过EF4我有我的数据库的模型。但也有传递给我的观点的模型和视图模型呢?

可以说我有一个项目的mvc模型。该项目具有描述,名称和类别属性。我有一个视图页面来创建一个项目并将其返回给控制器,通过ef4插入到数据库中。所以我最初创建了一个具有这些确切属性的类作为我的模型。然而,我的页面在创建该项目时还需要一个类别列表,因此我添加了一个字符串数组到我的模型中,该数组作为我的项目模型的一部分与其他属性一起传递到页面,并且工作正常。一切都很好......但我不得不想...因为如果项目模型模拟一个项目,那么它不应该有一个完整的类别列表。它应该只有属于该项目的一部分。

但这个完整的分类列表在哪里去。在视图包里?这对我来说似乎不正确?我应该创建视图模型吗?这个视图模型看起来如何?如何添加一个方法到项目模型,这将沿着GetCategories()的方向,然后我可以从视图页面调用这个方法......但是这是否打破了mvc中理想的关注点分离?

我相信很多人对这个主题会有不同的看法,但是任何能够帮助我解决这个问题的评论都会有所帮助。

感谢,

回答

0

在所有你最好不通过模型对象提出的意见,但最简单的应用程序。 View应该有一个ViewModel,它由Controller使用来自Model对象的数据构建,并包含View需要显示其信息的所有内容。

ViewModels将您的表示层与业务层分离,并且您的示例演示了为什么这很重要;您的视图需要关于Project的信息,而且还需要Project可能属于的所有Categories的完整列表 - 这样的列表在逻辑上不适合Project域模型对象,但完全符合ProjectViewModel的逻辑。

+0

谢谢史蒂夫,这当然有很大的意义...你会让类别列表视图模型的功能,并从视图运行?或者将在控制器中执行该操作? –

+0

我会有一个'SelectList Categories {get;组; }'ProjectViewModel'上的属性,并将其填充到Controller中。控制器会有一个[Repository](http://martinfowler.com/eaaCatalog/repository.html)对象(或[ServiceLayer](http://martinfowler.com/eaaCatalog/serviceLayer.html)对象,具体取决于大小通过它的构造函数注入到它中,并从中获取可用类的集合。 –