1

在我工作的地方,我们有一个项目,用 .NET3.5 编写的 webforms 项目。它是分层的;表示层,逻辑层,后面的数据。

我们每周都有这些“技术会议”在工作。我做了一个关于 MVC 的演讲。

我的技术主管决定插话,告诉我上面的项目(分层、网络表单)与 MVC 相同。他接着描述了以下内容:

  • 视图只是 ASPX 页面
  • 控制器只是页面后置
  • 模型只是数据对象

长话短说——我们就上述项目(分层网络表单)是否构成 MVC 展开了一场未决的辩论。

有人可以提供并回答这场辩论吗?

谢谢

4

3 回答 3

2

不。mvc 主要用于强大的关注点分离。控制器和视图没有绑定在一起,并且除了传递模型(或不传递)之外不知道对方。单个控制器可用于呈现许多视图,因为背后的 aspx 代码与单个 aspx 页面紧密相关,因为它们都是同一个部分类的一部分。模型差别不大,除了说在大多数 mvc 应用程序中,模型不是实际的域数据类型,而是一些可用于呈现视图的组合。

与 mvc 不同的另一件事是严格的分层文件夹结构和命名约定。这促进了最佳实践,并再次促进了关注点分离。

微软创建 asp.net mvc 框架是有原因的,尽管您可以使用路由等在 Web 表单中模拟一些 mvc 的感觉,但它不是,也不会是完全相同的东西。

此外,虽然这已倾向于 asp.net mvc,但显然还有许多其他方面。我建议您也检查一下FubuMVC

于 2012-02-17T05:05:06.260 回答
1

坦率地说,技术负责人是错误的。

以前从未使用过真正的 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 应用程序中,您的“模型”实际上会更准确地描述为“视图模型”,并且与您的数据或域模型完全分离。

总结

你的技术主管是错误的,不仅在语义层面上是错误的,而且在“你不知道你在说什么”层面上也是错误的。

  • 使用带有 Web 表单的分层架构并不意味着您已经实现了 MVC 模式。
  • ASPX 页面与视图完全不同
  • 代码隐藏与控制器完全不同
  • 模型与您的数据对象无关。

希望有帮助。

于 2012-02-18T11:16:57.873 回答
1

作为一种模式,MVC与任何特定技术(WebForms、WinForms、ASP.NET MVC 等)无关。

所以在 WebForms 中实际做 MVC 是很有可能的。

CodeBehind 文件可以被视为控制器,但从技术上讲它是不正确的:代码隐藏文件和 aspx 文件都只编译为一种类型(因为它们是部分类),因此在这件事上没有控制器类型和视图类型;)但是我们可以认为这种差异是次要的。

WebForms 可以被视为实现 MVC 模式的东西,承认它是一个非常丑陋的实现,很容易搞砸。但是一旦它搞砸了(就像它通常发生的那样),至少视图和控制器之间分离关注点的整个想法被违反了,所以一旦这种分离模糊或消失,我们应该说它不再是 MVC。

简历:WebForms 可以被视为 MVC 模式的实现,机器人在这个实现中很难遵循这种模式,所以它很少保留 MVC 并保持在它的概念内。

于 2012-02-17T05:10:09.063 回答