在我工作的地方,我们有一个项目,用 .NET3.5 编写的 webforms 项目。它是分层的;表示层,逻辑层,后面的数据。
我们每周都有这些“技术会议”在工作。我做了一个关于 MVC 的演讲。
我的技术主管决定插话,告诉我上面的项目(分层、网络表单)与 MVC 相同。他接着描述了以下内容:
- 视图只是 ASPX 页面
- 控制器只是页面后置
- 模型只是数据对象
长话短说——我们就上述项目(分层网络表单)是否构成 MVC 展开了一场未决的辩论。
有人可以提供并回答这场辩论吗?
谢谢
在我工作的地方,我们有一个项目,用 .NET3.5 编写的 webforms 项目。它是分层的;表示层,逻辑层,后面的数据。
我们每周都有这些“技术会议”在工作。我做了一个关于 MVC 的演讲。
我的技术主管决定插话,告诉我上面的项目(分层、网络表单)与 MVC 相同。他接着描述了以下内容:
长话短说——我们就上述项目(分层网络表单)是否构成 MVC 展开了一场未决的辩论。
有人可以提供并回答这场辩论吗?
谢谢
不。mvc 主要用于强大的关注点分离。控制器和视图没有绑定在一起,并且除了传递模型(或不传递)之外不知道对方。单个控制器可用于呈现许多视图,因为背后的 aspx 代码与单个 aspx 页面紧密相关,因为它们都是同一个部分类的一部分。模型差别不大,除了说在大多数 mvc 应用程序中,模型不是实际的域数据类型,而是一些可用于呈现视图的组合。
与 mvc 不同的另一件事是严格的分层文件夹结构和命名约定。这促进了最佳实践,并再次促进了关注点分离。
微软创建 asp.net mvc 框架是有原因的,尽管您可以使用路由等在 Web 表单中模拟一些 mvc 的感觉,但它不是,也不会是完全相同的东西。
此外,虽然这已倾向于 asp.net mvc,但显然还有许多其他方面。我建议您也检查一下FubuMVC。
坦率地说,技术负责人是错误的。
以前从未使用过真正的 MVC 框架的人有一个普遍的误解,即“MVC”只是 Web 表单的一种不同风格,而事实上,事实并非如此。
要理解为什么会这样,您需要了解MVC(架构模式)和ASP.NET MVC(由 Microsoft 构建的实现 MVC 模式的框架)之间的区别。
通常,不太了解该主题的技术主管和架构师等人会使用术语“MVC”来描述模式和框架,而不了解两者之间的区别,这通常会导致混淆。
因此,需要明确的是,MVC 模式并不是什么新鲜事物,它实际上由很多框架实现,例如:
Webforms不是开箱即用地实现 MVC 模式的框架之一。
现在确实可以在WebForms中实现 MVC 模式,但 Webforms 更适合实现 MVP 样式模式,并且实际上有一些框架(例如这个)可以在这方面为您提供帮助。
然而,技术负责人不知道他在说什么的最大指标是:
我的技术负责人决定插嘴,告诉我上面的项目(分层,网络表单)与 MVC 相同
在应用程序中引入“层”与 MVC 无关。事实上,在分层架构中,MVC 应用程序将完全位于表示层内,与其他应用程序层无关。
将 ASP.NET MVC 用于您的前端意味着您有一个表示层,它位于使用 ASP.NET MVC 框架实现的逻辑层之上。这并不意味着您突然不再需要其他层,因为您正在使用 MVC。
相反,Webforms 只是分层架构中的表示层。仅仅因为您使用的是分层架构并不意味着您使用的是 MVC 模式。
对于其他每个点:
视图只是 ASPX 页面 这是不正确的。ASPX 页面是非常复杂的野兽,在 MVC 视图之间有一个非常重要的区别:
它们旨在维护状态
他们拥有整个页面生命周期系统、视图状态和控件,旨在维护回发之间的状态。
ASP.NET MVC 被设计为无状态的,因此,视图不包含这种复杂性。
控制器只是页面后置
这种说法完全忽略了控制器的意义。
代码隐藏明确了解与呈现 ASPX 页面的过程有关的所有内容。它知道页面上的控件、页面的状态、页面的生命周期,并且与视图紧密耦合。
代码隐藏也只会返回一件事。一个aspx页面。
控制器更加灵活,不仅可以返回视图,还可以用于控制渲染数据不同表示的逻辑。例如,您可能希望将相同的数据呈现为标准 http 请求的 HTML,或呈现为 AJAX 请求的 JSON。
这是可能的,因为控制器逻辑和视图逻辑是松散耦合的,这使得这成为可能。
模型只是数据对象
这是错误的。在具有任何复杂性的任何类型的 MVC 应用程序中,您都很少将数据对象直接绑定到视图。简而言之,您的数据在数据库中建模的方式很少会代表显示视图所需的数据。
例如,假设您有一个员工记录,其中有一个“TitleId”。记录中的数据只是一个 int,但您需要向用户显示一个实际的文本值才能使其有意义。
因此,在大多数 MVC 应用程序中,您的“模型”实际上会更准确地描述为“视图模型”,并且与您的数据或域模型完全分离。
总结
你的技术主管是错误的,不仅在语义层面上是错误的,而且在“你不知道你在说什么”层面上也是错误的。
希望有帮助。
作为一种模式,MVC与任何特定技术(WebForms、WinForms、ASP.NET MVC 等)无关。
所以在 WebForms 中实际做 MVC 是很有可能的。
CodeBehind 文件可以被视为控制器,但从技术上讲它是不正确的:代码隐藏文件和 aspx 文件都只编译为一种类型(因为它们是部分类),因此在这件事上没有控制器类型和视图类型;)但是我们可以认为这种差异是次要的。
WebForms 可以被视为实现 MVC 模式的东西,承认它是一个非常丑陋的实现,很容易搞砸。但是一旦它搞砸了(就像它通常发生的那样),至少视图和控制器之间分离关注点的整个想法被违反了,所以一旦这种分离模糊或消失,我们应该说它不再是 MVC。
简历:WebForms 可以被视为 MVC 模式的实现,机器人在这个实现中很难遵循这种模式,所以它很少保留 MVC 并保持在它的概念内。