我习惯使用MVVM设计模式在WPF中工作,但最近我被要求在ASP.Net中做一些事情。我想尝试使用MVC,因为我在学习MVVM时看到它引用了很多,但是我对它一无所知。
我可以找到许多旨在向熟悉MVC的人解释MVVM的网站,但是找不到一个能够向曾经使用MVVM的人解释MVC的网站。有些网站可以自己解释MVC,但是我很难理解它们,因为我的思想一直在尝试应用MVVM逻辑。
那么,有没有什么好的网站可以解释MVC的用户MVVM可以理解?或者有人可以在这里向我解释一下吗?
答案 0 :(得分:5)
当你来自MVVM模式并从MVC模式(特别是ASP.NET MVC)开始时,我建议将“MVC”模式更好地视为“VMVC”,因为MVC中的“M”不是模型表示MVVM中的“M”。它实际上对应于 ViewModel 。我不知道这是否代表了MVC的一般定义,但是当你使用ASP.NET MVC时,它是真实的,也是最常用和最好的做法(尽管你在SO上看到的所有示例或问题都是域实体在视图中使用(有时这正是问题中描述问题的原因))。
当我从一个Visual Studio模板创建ASP.NET MVC项目时,我通常做的第一件事就是将创建的文件夹“Model”重命名为“ViewModel”。如果您查看模板代码对这些“模型”的作用,您会看到它们直接用于视图,它们具有用于输入验证的数据注释,用于显示格式以及可能在视图上的字段命名。这些注释部分由HTML帮助程序直接使用以生成HTML,而不表示域或业务逻辑。换句话说:它们是用于Razor / HTML视图的ViewModel,与在MVVM中使用ViewModel用于WPF / Silverlight / Phone7中的XAML视图的意义相同。
域“Model”实际上不是MVC模式的一部分,因为它是MVVM模式的一部分。因此,当您将MVVM与MVC进行比较时,缩写有些误导。作为一个非常简化的“翻译表”,人们可以说:
MVVM MVC
---- ---
M -> Domain Model not part of the pattern
V -> View (XAML) V -> View (HTML, Razor)
VM -> ViewModel M -> ViewModel
not part of the pattern C -> Controller
我不确定MVVM中控制器的相应内容。在MVC中,控制器通常是将域对象转换为ViewModel然后转换为视图的模块(反之亦然) - 示意图:
ControllerActionForGetRequest ( params )
{
objects = GetDomainObject(params) - entities, queryables or DTOs
viewModel = CreateViewModelFromDomainObjects(objects)
view = CreateViewFromViewModel(viewModel)
}
ControllerActionForPostRequest ( viewModel )
// ModelBinder makes "viewModel" from HTML input fields, etc
{
if (IsValid(viewModel))
{
data = CreateDomainObjectsOrDtosFromViewModel(viewModel)
WriteData(data) - back to data store
RedirectToActionForGetRequest
}
else
GoBackToView
}
MVVM中哪个部分有这个责任?我不确定。我已经看到了ViewModel拥有对存储库的一些引用的设计,拉出模型(域模型)来填充它自己的属性并通过ICommand处理程序写回存储库。这意味着MVVM中的ViewModels也有责任成为“控制器”,而MVC中的ViewModels要简单得多:它们或多或少只是带有元数据的属性包,可以为视图提供和格式化数据。
作为最后一点:我个人认为使用WPF的MVVM模式比MVC模式更难掌握。 ASP.NET MVC是从地面设计的,以支持MVC模式友好的开发,并且不需要(甚至不可能)离开这种方式。 WPF不是这种情况。原始设计是在构建时考虑了视图和代码隐藏文件,而不是MVVM模式。我经常发现将视图元素或属性绑定到ViewModel非常困难的情况,并且在代码behing文件中处理它更容易,因此稍微违反了MVVM原则。
我认为当您有MVVM模式经验时,进入MVC会有任何问题。
答案 1 :(得分:2)
我原来是一名WebForms开发人员,我绝对可以证明在学习另一种技能的同时掌握某种技术,迫使你的逻辑以某种方式转变。从Webforms开始尤其困难 - > MVC。我最好的建议是将该音乐商店教程的每个方面分析为一个单独的实体。
祝你好运,我希望有所帮助。