WPF中的MVVM模式非常强调将ViewModel与UI完全分离,而且理想情况下,代码隐藏文件中没有或很少包含任何内容。这允许对不同类型的接口重用ViewModel。
Razor页面中的MVVM模式将代码隐藏作为ViewModel,并与OnGet和OnPost方法的web逻辑紧密耦合。
因此,精心编制的解耦的WPF ViewModel不能充当ViewModel (或者可以从网页模型中使用?)
我是不是遗漏了什么,为什么WPF中的MVVM (解耦的)和Razor页面中的MVVM (耦合)之间有如此的区别?
如果我们将Razor方法应用于WPF,那么代码--幕后代码--将成为ViewModel --我从未见过有人推荐它。
发布于 2019-03-11 12:31:02
我不知道为什么您坚持使用Razor页面,当有MVC ()时。
您应该使用MVC模式。您得到相同的剃须刀语法,但解耦。
剃须刀页面是作为WebForms的后继形式引入的(它本身试图模仿Windows,这两者都不是关于解耦的)。
如果我们追溯到几年前的历史,MVVM将使用WPF的双向模型绑定的全部功能,它作为UI和应用程序层之间的一个独立层,可以将表示逻辑放入其中(逻辑紧密耦合到表示中,这是一个UI关注点,而不是与UI分离的应用层)。
由于这个原因,MVVM的ViewModels (除了模型绑定的属性之外)还具有命令之类的东西,并且可能是导航感知的(即通过棱镜的INavigationAware接口)。
在这种情况下,ViewModels在服务器端web应用程序中没有多大价值,因为HTTP本身是无状态的,ViewModels在这里维护状态。
因此,MVC中的ViewModels被简化为DTO(数据传输对象),它具有基本的验证(通过验证属性)。MVC应用程序中的ViewModels没有任何表示逻辑,因为它被呈现为HTML,而且大多数表示逻辑都是通过JavaScript在外部发生的(单击按钮会发生什么情况,如何为用户格式化日期或货币)。
尽管如此,在一个ViewModels核心应用程序中,您并不需要使用完整的ASP.NET,至少对于服务器端的部分是这样的。但是,如果您使用的是客户端技术( Vue.js、React),则可以使用ViewModels增强功能并将其与视图分离。
实际上,角分量基本上是ViewModels,并完成与MVVM模式中的ViewModels相同的任务(可以将服务注入其中,有单向或双向绑定,输入验证,并将表示逻辑放入其中)。
TL;DR:您实际上并不需要ViewModels,因为它们是在MVVM中定义的,只是DTO类类使在(Razor)视图模板中使用它们更容易。不要使用Razor页面进行解耦。
https://stackoverflow.com/questions/55100912
复制相似问题