我正在学习ASP.NET MVC并下载了几个示例应用程序。 MusicStore等...
我来自wpf背景,我们有MVVM模式。 我注意到他们使用了模型和ViewModel的概念。
在MVVM中很清楚,您将视图绑定到ViewModel,将模型注入viewModel。 在MVC中你有一个控制器,但我不确定和混淆所有联系在一起,因为我看不到注入ViewModel的模型
我有以下结构
从一些例子中我看到你的模型充当ViewModel.Am我是否正确?
让我们拿一个像
这样的控制器public class ProductController
{
public ProductController(IProductRepository productRepository)
{
//omitted as not relevant
}
}
public class ProductVM
{
public ProductVM()
{
// Shouldn't we inject the model here RG Product
}
}
我可以参考一些N层示例吗? ViewModel的概念在MVC中是否有效? 标准是什么?
感谢您的任何建议。
答案 0 :(得分:35)
使用 ViewModels 来简化视图。
例如,您可能拥有包含产品,订单,客户等的深层对象图 - 并且特定视图中需要来自每个对象的一些信息。
ViewModel提供了一种将View所需信息聚合到单个对象中的方法。
ViewModel还允许数据注释和验证等内容 - 这些内容不属于您的模型,因为您的模型应保持“特定于域”。
但实际上,ViewModel只不过是域对象的简单包装器。
使用AutoMapper等工具轻松地在ViewModel和域模型之间来回映射。
我个人始终绑定到View中的ViewModel,从不绑定到域模型,即使它是单个对象。为什么?我喜欢使用UIHints,验证,数据注释来装饰我的ViewModel。就像使用特定于域的规则和业务逻辑丰富您的域模型一样,您的ViewModel也应该使用特定于UI的逻辑进行丰富。
如果您只是一个具有1-1域代表模型的对象,那么您就错过了ViewModel的观点。
仅添加到ViewModels,仅此而已,特定视图所需的内容。
控制器操作示例
public ActionResult CustomerInfo(int customerId)
{
// Fetch the customer from the Repository.
var customer = _repository.FindById(customerId);
// Map domain to ViewModel.
var model = Mapper.Map<Customer,CustomerViewModel>(customer);
// Return strongly-typed view.
return View(model);
}
答案 1 :(得分:2)
MVC和MVVM之间的区别在于MVC有一组用于数据实体的类。在MVVM中,您有2个用于绑定视图的集合,以及一个用于管理数据持久性的集合(例如,可以在单独的WCF服务中)。
MVVM的好处是绑定到视图的模型与UI相关,并且与持久性模型完全独立。
使用哪个?那么它取决于您的视图所需的数据结构与数据库结构的紧密程度。当它相似时 - 可以将DAL中的DataEntities直接绑定到您的视图 - 这是经典的MVC模式。但是,您可以使用单独的ViewModel获得更多,因为您可以使用您的DAL不应关注的View特定行为(例如,验证)扩展这些类。
除了最简单的应用程序外,我建议使用单独的ViewModel。