【问题标题】:tiered webforms classified as MVC?分类为 MVC 的分层网络表单?
【发布时间】:2012-03-08 13:08:26
【问题描述】:

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

我们每周都会举办这些“技术会议”。我做了一个关于 MVC 的演示。

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

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

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

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

谢谢

【问题讨论】:

  • 只有我厌倦了网站的 n 层架构吗?
  • 抛开语言和框架不谈,这是否可以说它遵循“MVC 模式”,因为它仍然具有“模型”、“视图”和“控制器”?

标签: .net model-view-controller architecture webforms 3-tier


【解决方案1】:

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

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

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

此外,虽然这已倾向于 asp.net mvc,但显然还有许多其他方面。我建议你也去看看FubuMVC

【讨论】:

  • 如果您声称控制器只是数据管理器怎么办?例如: - 视图是 ASPX 页面 - 控制器是数据访问类 - 模型是数据对象
  • @user1215399,这仍然是一个不正确的评估。控制器更像路由器。他们收到请求,然后将您路由到适当的视图。我实际上认为控制器实际上应该与数据无关,只知道他们将传递给他们的视图的模型。
  • 抛开语言和框架不谈,这是否可以说它遵循“MVC 模式”,因为它仍然具有“模型”、“视图”和“控制器”?
【解决方案2】:

a pattern MVC 与任何特定技术(WebForms、WinForms、ASP.NET MVC 等)无关。

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

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

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

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

【讨论】:

  • 如果您声称控制器只是数据管理器怎么办?例如: - 视图是 ASPX 页面 - 控制器是数据访问类 - 模型是数据对象
  • 我从未见过有人在 webforms 中成功实现 mvc。尝试似乎很愚蠢。 mvp 和 web/win 表单一样好
  • @user1215399 不,我从来没有这么说,我不这么认为。对我来说,控制器不是数据访问类(存储库可能是),模型也不是一堆 DTO。
  • @nathangonzalez 同意,MVP 看起来更合适。
【解决方案3】:

坦率地说,技术主管是错误的。

在以前从未使用过真正的 MVC 框架的人们中存在一个普遍的误解,即“MVC”只是 Web 表单的一种不同风格,而事实上,事实并非如此。

要了解为什么会出现这种情况,您需要了解架构模式MVC 和微软构建的实现 MVC 模式的框架ASP.NET MVC 之间的区别。

通常,技术主管和架构师等不太了解该主题的人会使用术语“MVC”来描述模式框架不了解两者之间的区别,这通常会导致混淆。

所以,要明确一点,MVC 模式并不是什么新鲜事物,它实际上由很多框架实现,例如:

Webforms 不是开箱即用地实现 MVC 模式的框架之一。

现在确实可以在 WebForms 中实现 MVC 模式,但 Webforms 更适合实现 MVP 样式模式,而且实际上有围绕 (such as this one) 的框架可以在这方面为您提供帮助。

技术主管不知道他在说什么的最大指标是:

我的技术主管决定插嘴,告诉我上面的项目 (tiered, webforms) 和 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 页面与视图完全不同
  • 代码隐藏与控制器完全不同
  • 模型与您的数据对象无关。

希望对您有所帮助。

【讨论】:

  • 抛开语言和框架不谈,这是否可以说它遵循“MVC 模式”,因为它仍然具有“模型”、“视图”和“控制器”?
  • 假设你有一只烤羊肉,你在主餐后上桌,它会变成沙漠吗?配上冰淇淋、蛋奶沙司和沙漠酒会变成沙漠吗?不,因为它不符合公认的沙漠定义。 Webforms 也是如此。仅仅因为你在你的项目中加入了一些称为“模型、视图和控制器”的类,并不能使它成为 MVC 实现,就像用冰淇淋烤羊肉使它成为沙漠一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多