65.9K
CodeProject 正在变化。 阅读更多。
Home

WebForms vs. MVC

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (269投票s)

2013年1月15日

CPOL

15分钟阅读

viewsIcon

1095566

downloadIcon

12773

ASP.NET MVC 是 Web Forms 的替代品吗?不是,两者都有其优缺点。让我们来看一下。

引言

我是一名 ASP.NET 开发人员已经很久了,我很喜欢用 Web Forms 编写 Web 应用程序。

2008 年,微软推出了名为 ASP.NET MVC 的产品,我对“为什么还需要另一个 ASP.NET 技术?”这个事实感到非常惊讶,而且很多人至今仍在困惑。

许多人说 ASP.NET MVC 取代了 ASP.NET Web Forms。但事实并非如此。两者都有各自的优缺点。没有人能告诉我们该使用什么以及何时使用,但我们可以讨论一些事实,这些事实将帮助我们在这两者之间做出选择。本文就包含这些内容。

我们还试图找到一些问题的答案,例如:
  • 什么是 ASP.NET?
  • 什么是 ASP.NET Web Forms?
  • 什么是 MVC?
  • 什么是 ASP.NET MVC?

如果您是一位高级或经验丰富的 ASP.NET MVC 开发人员,已经非常了解 MVC,那么本文将帮助您复习概念。

索引/目录

讨论 Visual

微软最初推出了名为 Visual 的产品。借助 Visual Basic、Visual C++ 等技术,微软实现了图形用户应用程序的 RAD(快速应用程序开发)。拖放和智能感知等功能使开发人员能够更多地关注应用程序的业务功能,而不是 UI 设计。
但这些技术仅限于桌面,当涉及到 Web 时,微软唯一剩下的选择是 ASP。

Web 技术

当我们说 Web 技术时,我们有经典的 ASP、php、jsp、ROR、ASP.NET Web Forms、ASP.NET MVC 等等。经典 ASP 是微软推出的 Web 技术之一。经典 ASP 的最大痛点是意大利面条式代码和可维护性。让我们假设一个场景,您有一些文本框和一个按钮。单击按钮后,您会在服务器上验证数据,如果验证成功,数据将存储到数据库中;如果验证失败,错误消息将以红色标签的形式显示给用户。您知道这个场景最大的问题是什么吗?您必须自己做很多事情。

  1. 首先,通过将 form 的 action 属性值设置为同一页面来使自回发(self-post back)。
  2. 单击按钮时,文本框的值将清空,因此唯一选择就是从发布的数据中检索值。
  3. 如果验证失败,您必须显式地
    1. 从发布的数据中将所有值设置回相应的文本框
    2. 显示错误消息。

(使用 Ajax 是另一种方法。这里我试图解释使用经典 ASP 所需的手动工作)

Web 中的 Visual

Visual Basic 等技术仅限于独立应用程序,当涉及到 Web 时,微软唯一剩下的选择就是经典 ASP。

当我们谈论 Web 和桌面时,应该考虑两件事:

  1. 状态管理如何工作?
  2. 请求/响应如何工作?

Web 基于 HTTP,这是一个完全无状态的协议。我们将拥有独立的请求和响应,与之前的请求和响应无关。与桌面应用程序不同,没有变量值会被保留,也没有完整的事件驱动的编程模型。它不像桌面那样等待用户输入,而是每次用户输入和交互都被视为一个新的请求(GET/POST)发送到服务器。

最终,微软推出了 ASP.NET Web Forms,优先考虑快速应用程序开发和易于学习。

什么是 ASP.NET?

ASP.NET 是微软的一个 Web 应用程序框架,建立在公共语言运行时(Common Language Runtime)之上,用于使用 C#、VB.NET 等编程语言构建动态 Web 站点。它支持两种模型:Web Forms 和 ASP.NET MVC。

什么是 Web Forms?

微软首先从 ASP 引入了 ASP.NET Web Forms,它通过在无状态 Web 之上创建更高级别的抽象并为 Web 开发人员模拟有状态模型,解决了许多问题。在 Web Forms 中,引入了自回发(将表单数据回发到同一页面)和 ViewState(在回发期间维护控件值)等概念。最有趣的部分是,甚至不需要编写一行代码。通过 Web Forms,微软试图将 Visual Basic 模型引入 Web。

让我们谈谈 Web Forms 的优点和缺点。

优点

  • Web Forms 支持丰富的服务器控件
    • 在使用纯 HTML 时,您可能已经注意到,在不同地方的情况并非总是相同。
      在 IE 中看起来很棒的 UI 在 Firefox 中可能会显得很糟糕,反之亦然。
      ASP.NET 服务器控件会检测浏览器并生成适当的 HTML,如果需要,还会生成 JavaScript。
    • GridView 和 ListView 等许多服务器控件都带有数据绑定功能,大大减少了工作量和编写的代码量。
  • 支持 ViewState - 您可能已经多次听说“HTTP 是一个无状态协议”。通常,控件在请求之间不会保留其值。但在 Web Forms 中,通过将每个控件的最后已知状态存储在客户端页面本身中,以隐藏字段 ViewState 的形式来实现有状态。
  • 事件驱动编程 -


    通过
    • 代码隐藏
    • 自回发机制(将表单回发到同一页面)
    • 视图状态(ViewState)
    微软在互联网世界引入了事件驱动编程。

    开发人员不再依赖 POST、GET 方法来处理用户与服务器的交互。例如,她/他会将一个控件(比如按钮)拖到页面上,只需双击它即可生成处理用户单击服务器的代码块,并在其中编写逻辑。就是这样。她/他不必关心内部发生的事情。

  • 快速应用程序开发 - 我认为这不需要任何解释。丰富的服务器控件、事件驱动模型和 ViewState 极大地提高了开发速度,开发人员不必处理许多后台复杂性。
  • 学习成本低。 - 使用强大的服务器控件和 ViewState,开发人员可以用最少的 HTML 和 JavaScript 技能开发实际应用程序。

缺点

  • 项目架构

    在创建 Web 应用程序时,Web Forms 没有固定的预定义项目架构。开发人员在选择自己的架构方面具有完全的灵活性。
    可以采用基本的三层架构,将系统分为 UI、业务层和数据访问层,或者更高级的 Model-View-Presenter。甚至可以选择仅使用代码隐藏并将所有内容都写在那里,这根本不被认为是好的做法。代码隐藏与 UI 紧密耦合,最终会产生一些表示逻辑。

  • 单元测试

    在 Web Forms 中,代码隐藏最终会产生大量的事件处理程序,使得自动单元测试成为一项不可能完成的任务。
    注意:据我所知,即使借助模拟测试(使用 MOQ 或 rhinomoq),我们也无法模拟事件处理程序中的 'sender' 和 'eventargs'。

    当我们谈论采用 TDD 时,对代码隐藏(表示逻辑)进行单元测试变得非常重要。

  • 性能

    ViewState 解决了经典 ASP 的一些问题,但它也成了一个问题。ViewState 存储在页面本身中,导致页面大小增加,从而降低了性能。

  • 可重用性

    让我们以另一个例子为例,我们要构建 2 个 UI
    • 应税员工屏幕
    • 非应税员工屏幕
    现在,大部分代码隐藏逻辑对于两个屏幕都是相同的。
    一个解决方案是,在代码隐藏中添加一些 if 条件,并创建一个单一的 UI。
    • 这将违反单一职责原则,该原则认为软件实体应该只有一个被更改的原因,因为在这种情况下,当应税/非应税信息发生变化时,员工表单也会发生变化。
    • 其次,有可能这两个 UI
  • 对 HTML 的控制较少 - 在 Web Forms 中,我们通常不确定最终会得到什么样的 HTML,这使得与 jQuery 等 JavaScript 框架集成变得困难。
  • SEO


    URL 指向固定的 ASPX 页面,这些页面可能带有查询字符串。它们不用户友好,并且会影响 SEO。

  • 并行开发支持较少 - ASPX 页面与代码隐藏文件紧密耦合。因此,不可能让 2 个不同的开发人员同时处理一个部分(一个处理 aspx,一个处理代码隐藏)。

ASP.NET 4.0

ASP.NET 4.0 带来了一些不错的功能来克服上述一些问题。

  • ViewState:提供禁用或控制 ViewState 大小的方法。(但没有强制或固定规则规定必须这样做。)
  • URL 路由:使用 URL 路由,我们可以提供自己的 URL 来替代页面的物理路径。
  • ID:在 ASP.NET 4.0 中,我们可以更好地控制元素的 ID,从而使与 JavaScript 框架的集成变得更容易。(我们仍然无法完全控制生成的 HTML。)

即使 ASP.NET 革命性的功能不断演进,

  1. 它仍然未能解决单元测试的问题。
  2. 我从未见过任何 ASP.NET Web Form 开发人员尝试禁用 ViewState。Smile | <img src= (这是我的看法,请勿当真。)
  3. 我们对元素的 ID 有所控制,但对 HTML 的控制并不完全,仍然在实现 JavaScript 方面存在问题。

什么是 MVC?

MVC 是一种已经存在一段时间的架构模式。
包括 Java 在内的许多人都使用它。它并不是微软推出的新概念。ASP.NET MVC 是我们应该谈论的。但在那之前,让我们先弄清楚一些术语,包括 MVC。

  • 模式 (Patterns) - 简单来说,模式是在特定上下文中解决问题的方案。
  • 架构模式 (Architectural Patterns) - 架构模式是解决子系统级别或模块级别问题的方案。它处理与项目架构相关的问题。它告诉我们如何划分我们的系统,尤其是为什么。我们创建类库、组件、Web 服务来解决问题。
  • MVC 当我们谈论应用程序时,我们会涉及输入逻辑、业务逻辑和 UI 逻辑,而 MVC 是一种架构模式,它使我们能够在这些元素之间实现松散耦合来开发应用程序。
    MVC 模式背后的主要目的是关注点的分离。它使表示层或 UI 忽略业务逻辑和用户交互逻辑。
    根据 MVC,系统应划分为 M(模型)、V(视图)和 C(控制器)。
  • 模型被认为是智能的,负责处理业务规则、逻辑和数据,并且独立于 MVC 的其他部分(控制器和视图)。
  • 控制器接收并分派请求,简而言之,它负责处理用户交互和输入逻辑。它同时了解模型和视图。
  • 视图被认为是“哑巴”的,是模型数据的输出表示。它可以是 Excel 表格、显示记录列表的网页,或者只是简单的文本。视图只了解模型。

什么是 ASP.NET MVC?

ASP.NET MVC 是微软的另一个 Web 应用程序框架,其设计理念是关注点的分离和可测试性。它基于 CLR,完全基于 MVC 架构,因此我们按照控制器和视图来思考。ASP.NET 不支持 ViewState 和服务器控件,所以我们能感受到老式 Web 的感觉。让我们谈谈 ASP.NET MVC 的优缺点。

优点

  • 项目架构 -
    使用 ASP.NET MVC 的一个优点是它强制执行关注点的分离。因此,事物变得复杂的机会非常小。
  • 测试驱动开发和可重用性
    • 在 MVC 中,控制器是一个单独的类,因此可以实现自动测试,支持测试驱动开发。
    • 控制器不绑定到任何特定的视图,因此可以被多个视图重用。
  • 性能 - ASP.NET MVC 不支持 ViewState,因此没有自动状态管理,这会减小页面大小,从而提高性能。
  • 对 HTML 的完全控制 - ASP.NET MVC 不支持服务器控件,唯一可用的选项是使用 HTML 输入控件,因此我们确切知道最终渲染的 HTML。我们还知道每个元素的 'id'。因此,ASP.NET MVC 应用程序与 jQuery 等第三方 JavaScript 库的集成变得容易。
  • 并行开发支持 - 在 ASP.NET MVC 中,各层之间是松散耦合的,所以一个开发人员可以处理控制器,同时另一个处理视图,第三个处理模型。这称为并行开发。
  • SEO、URL 路由和 REST - 丰富的路由功能使每个 URL 都可以作为支持 RESTful 接口的资源来处理。
  • 用户友好且可读的 URL 也有助于提高 SEO。

  • 可扩展性 - ASP.NETMVC 支持多种视图引擎,如 aspx、razor,如果需要,我们还可以创建自己的视图引擎。
  • 现有的 ASP.NET 功能 – ASP.NET MVC 框架建立在成熟的 ASP.NET 框架之上,因此为开发人员提供了许多有用的功能,如表单身份验证、Windows 身份验证、缓存、会话和配置文件状态管理等。

缺点

  • 学习成本高 - 缺乏事件驱动编程模型和 ViewState,使得 ASP.NET MVC 对于没有或很少有 Web 应用程序开发经验的开发人员来说是一个非常困难的框架。

ASP.NET MVC 如何工作

  1. 用户请求服务器上的某个资源(通过在浏览器中输入某个 URL)。
  2. 请求首先到达控制器(路由引擎负责决定哪个请求由哪个控制器处理。在本文中,我们不会深入讨论这个行为)。
  3. 如果需要,控制器会与模型通信以获取数据。
  4. 模型操作数据库(或其他数据源),并将数据(以业务对象的形式)返回给控制器。
  5. 控制器选择适当的视图(例如,客户视图,其中可能包含一些 HTML 表格、下拉列表、文本框……)。
  6. 控制器将数据(在第 4 步检索到的模型数据)传递给选定的视图(在第 5 步),其中数据将根据方便程度进行填充。
  7. 控制器将视图发送回用户。

以上是 GET 请求的情况,POST 请求也是如此。只是用户不是在浏览器中输入 URL,而是对已请求的页面执行某些操作,然后流程从控制器开始。操作包括单击按钮、更改下拉列表值等。

为什么选择 ASP.NET Web Forms 和 ASP.NET MVC?

每种技术都可以是特定解决方案的“最佳选择”,具体取决于应用程序的需求以及参与团队成员的背景。选择什么以及何时选择更多地取决于业务角度,而不是哪个技术比另一个更好。在面临选择 ASP.NET Web Forms 或 ASP.NET MVC 的决定时,重要的是要知道这两种技术都不是为了相互取代而设计的。

您在做出选择时应考虑的两个重要因素是:
  1. 快速应用程序开发 - 如果您想快速开发任何东西,ASP.NET Web Forms 是您唯一的选择,您甚至不能考虑 ASP.NET MVC 来进行 RAD。(RAD 的原因可能有很多,例如客户支付的费用不高,或者应用程序将只使用一两个月,并且不需要太多维护。)
  2. 单元测试 - 如果自动单元测试是您最重要的因素,那么 MVC 将最适合您。

除此之外,您可以做的是,写下您所有的项目需求,并尝试将它们与 Web Forms 和 MVC 的优缺点进行比较,如果可能,尝试问自己以下问题,并相应地为 MVC 和 Web Forms 打分。

  1. 您的团队是否在 Web Forms 或 Windows Forms 方面拥有丰富的经验?
    如果答案是肯定的,那么学习 ASP.NET MVC 对团队来说将是一项艰巨的任务,因为开发人员已经习惯了 ViewState 和事件驱动编程,迁移将是一项艰巨的任务。Web Forms 得 1 分。
  2. 您的团队在 ASP.NET MVC 方面是否拥有丰富的经验?
    如果答案是肯定的,ASP.NET MVC 得 1 分。
  3. 您的团队是否有 ASP 或非微软技术(如 Android、iOS、JSP、ROR、PHP)的经验?
    如果您之前是 JSP 或 ASP 开发人员,那么您可能熟悉 HTTP GET 和 POST,甚至可能接触过 MVC,因为它们中的大多数默认使用 MVC。这给 ASP.NET MVC 加 1 分。
  4. 是否会广泛使用 JavaScript?
    如果是,MVC 得分,因为您可以完全控制 HTML。ASP.NET MVC 得 1 分。
  5. 正在寻找良好的性能?
    由于不支持 ViewState,ASP.NET MVC 与传统的 ASP.NET Web Forms 相比提供了更好的性能增益。ASP.NET MVC 得 1 分。
  6. 计划重用相同的输入逻辑?
    如果是,请坚持使用 MVC。

结论

我认为您应该已经获得了足够的信息来决定什么最适合您的项目。完整的决定取决于您的团队和项目需求。

希望大家喜欢阅读这篇文章。感谢您的耐心。

有关各种主题的技术培训,包括 ASP.NET、设计模式、WCF 和 MVC,请联系 SukeshMarla@Gmail.com 或访问 www.sukesh-marla.com

要获取更多类似内容,请单击此处。这里。订阅文章更新或在 Twitter 上关注 @SukeshMarla

还可以查看我们完整的MVC(模型-视图-控制器)分步系列

单击此处观看 MVC 视频分步教程

© . All rights reserved.