先进
Web 窗体和 ASP.NET MVC 比较
Dino Esposito
内容
Web 窗体的优点
Web 窗体的缺陷
ASP.NET MVC 的优点
ASP.NET MVC 的缺陷
右侧角度来看
ASP.NET 的模型完全是什么?
undisputable 事实
一天的末尾
首先,我看到 Microsoft ASP.NET 在 1999 年,时它已暂时命名 ASP + 操作中。 次构建在 Microsoft 平台上的一个 Web 应用程序时的组合活动服务器页 (ASP) 的一组。
在一个典型的 ASP 页中,您将发现点缀有代码块的 HTML 文本。 在代码块中 (主要是 VBScript) 的脚本代码用于合并生成的 COM 对象,如从 ActiveX 数据对象 (ADO) 框架组件的数据。 肯定,在二十世纪九十年代末的 ASP.NET 引入了一个大的步骤以它表示一种自动化客户端的浏览器中显示的 HTML 的生产的智能方法中转发。
ASP.NET 简化日常任务的一个数,并且启用的 abstraction.This 的更高级别工作的开发人员更重要的是允许其集中多个 Web 应用程序的核心功能而不是网页设计周围的常见任务。
基于服务器控件,ASP.NET 允许开发人员构建实际的网站和应用程序最小的 HTML 和 JavaScript 技能。 整个 ASP.NET 点是通过在运行时,以及提供的服务器控件、 用户控件,回发事件,视图状态,窗体的身份验证和内部对象的开发设施集成功能强大的工具来实现的效率。 在 ASP.NET 模型调用 Web 窗体,并且它已清楚地 inspired 桌面 Windows 窗体模型 (又深 inspired 通过在 Visual Basic 快速应用程序开发的基本原理)。
因此为什么了 Microsoft 发行"其他"调用 ASP.NET MVC 的 ASP.NET 框架? 在本文中,我将探讨 ASP.NET Web 窗体和 ASP.NET MVC 的优缺点。
Web 窗体的优点
记下,ASP.NET Web 窗体是稳定和成熟,它支持的第三方控件和工具的堆。
使用 ASP.NET 的快速采用键之一肯定是来自 Windows 桌面开发,指向和单击比喻。 使用 Web 窗体,Microsoft 基本上扩展 VBA 编程模型,以在网站。 Web 是本质上是无状态,而桌面的制定但是,是有状态。 因此 Web 窗体模型实质上被抽象了许多功能为 Web 开发人员提供一个模拟的状态模型。 鍥犳 您没有必须被专家 HTML 的很多 Web 和 JavaScript knowledgeto 编写有效的 Web 应用程序。
要在 Web 上模拟状态编程,引入 ASP.NET Web 窗体功能 (如视图状态,回发和一个事件驱动的总体 paradigm.For 示例开发人员可以说,双击自动生成的代码将处理用户单击到服务器存根在按钮上。 若要开始编写的 Web 应用程序,您只需了解.NET 开发,与服务器控件一样的某些特殊组件的编程接口的基础知识。 以编程方式,生成 HTML 服务器控件和在运行时管道快速开发周期将显著影响。
结尾的一天的 ASP.NET Web 窗体的主要功能是只是一些 ASP 的最佳做法 componentization。 例如,回发、 自动样本总体的输入的字段、 身份验证和授权页呈现,服务器的控件和页的编译之前不设计,并且为 ASP.NET Web 窗体的从头创建的功能。 所有这些发展从 ASP 的最佳做法。 十年前,ASP 开发人员 (包括我自己) 所查找准确的 Web 窗体结束上提供的功能集。 此外,ASP.NET Web 窗体通常超过我们期望通过提供位于鏁翠釜 Web 堆栈顶部的一个完整的抽象层: JavaScript,CSS,HTML。
若要写入 ASP 页需要做很有点了解 Web 和脚本语言。 若要写入一个 ASP.NET 页相反,需要主要了解.NET 和其已编译的语言。 工作效率和数据驱动的业务线应用程序快速开发了 ASP.NET Web 窗体的卖点。 直到现在的。
Web 窗体的缺陷
在此不完美的世界中的许多其他事情,如 ASP.NET Web 窗体不是免费的问题。 年经验的证明超出分离 (SoC) 的问题还没有一个自然适合在 Web 窗体模式与任何合理的疑问。
ASP.NET Web 窗体应用程序的自动化测试是硬,并不只是由于缺乏 SoC. Web 窗体基于一个单一的运行时环境,可以扩展,一些的程度上,但不是一种可插入和灵活系统。 测试不旋转整个运行时设置的 ASP.NET 应用程序几乎不可能的。
实现 statefulness,每服务器页的最后一个已知的状态存储在客户端页作为隐藏字段中,视图状态。 虽然视图状态已经常被设置保存为 Web 窗体有什么问题的示例,不为它的由出该怪物。 实际上,使用传统的 ASP 类似于视图状态的结构是 cutting-edge 解决方案。 从一个 ASP 角度模拟 statefulness 也就是回发,视图状态控件) 的一个很好的成绩,相同的还说首先有关如何从 HTML 和 JavaScript 的详细信息 Web 窗体隔离本身。
现代的网页的 HTML 的抽象是一个严重问题阻碍可访问性、 浏览器的兼容性和流行的 JavaScript 框架 (如 jQuery、 Dojo 和 PrototypeJS 与集成了。 回发到自身,每个页的默认模型使得很难搜索引擎排名高的 ASP.NET 页。 搜索引擎和 Spider 处理更好地与参数,链接更好地合理化人类可读的字符串。 回发的模型是相反的方向。 此外,一个过大的视图状态是有问题,因为级别基于该关键字可能位于过去在的视图状态并因此远从文档的顶部。 某些引擎在这种情况下识别一个较低级别。
ASP.NET MVC 的优点
ASP.NET 4.0 中,可以修复的一些与 Web 窗体模型识别问题。 可以禁用或控制的视图状态大小。 (即使已经注意到似乎很少的开发人员的视图状态大小减小显著从 ASP.NET 1.1 转换到 ASP.NET 2.0 中 Microsoft 引入一个更有效的序列化算法时。 在 ASP.NET 4.0 中,您也有望改进的方式的视图状态可以禁用和控制)。 可以使用一个特别的 HTTP 模块执行 URL 重写,或者更好地还,使用路由从 ASP.NET 3.5 SP1 的 API 在最新网站。 在 ASP.NET 4.0 中,可以 minutely 控制包括范围内的元素的元素的 ID。 同样,在 ASP.NET 4.0 的外部 JavaScript 框架集成会更简单、 更有效。 最后,历史记录管理 API 在 ASP.NET 3.5 SP1 中的做 AJAX 回发的工作组合在一起时生成一个友好的搜索引擎的页。
在许多方面,Web 窗体在 ASP.NET 4.0 模型是 tackles 前面提到的缺陷的一些一个更好地环境。 这样的 ASP.NET MVC 的点是什么?
您会发现对 ASP.NET MVC 的好介绍在 2008 年 3 月 MSDN 杂志 (" 构建 Web 应用程序,而 Web 窗体"),位置丽丽 Tavares 解释 Web 窗体没有 ASP.NET 开发的基础知识。 摘要,ASP.NET MVC 是构建 ASP.NET 应用程序,设计从一开始就设置 SoC 和可测试性记住一个完全新框架。 当您编写 ASP.NET MVC 应用程序时, 您认为的控制器和视图。 您决定您如何将数据传递到视图和如何公开您到控制器的中间层。 控制器选择的视图以显示根据请求的 URL 和相关的数据。 通过调用控制器类上的一个方法来解决每个请求。 不回发是向用户请求提供服务以往任何时候都必需的。 没有的视图状态需要,以保持页的状态。 没有 arraysof 黑色框服务器控件存在以生成 HTML 浏览器。
与 ASP.NET MVC,您 rediscover 站点的好旧体验 — 无状态行为、 HTML、 总的脚本和 CSS 自由的每个单个位的完全控制。
HTML 提供给浏览器将生成一个单独,和替换,引擎。 在 ASPX 物理服务器文件上还有没有依赖项。 ASPX 文件可能仍然是您的项目的一部分,但它们现在用作纯 HTML 模板连同其代码隐藏类。 默认视图引擎基于 Web 窗体呈现引擎中,但您可以使用其他可插入的引擎,如 nVelocity 或 XSLT。 (有关详细信息,具有查看 MVCContrib 网站,网址 mvccontrib.codeplex.com)。
运行库环境是很大程度上与在 ASP.NET Web 窗体中相同,但请求周期更简单、 更直接。 Web 窗体模型,在页面生命周期的重要部分不再需要在 ASP.NET MVC 中。 应该注意,但,在 ASP.NET MVC 中,默认视图引擎仍然基于在 Web 窗体呈现引擎。 这是允许您使用 ASP.NET MVC 视图中的母版页和一些服务器控件在技巧。 只要视图引擎基于 Web 窗体,该视图是您可以在其中处理经典的事件,如初始化、 负载、 PreRender,以及特定于控件的事件 (如 RowDataBound GridView 控件的常规代码隐藏类的 ASPX 文件。 如果您切换默认视图引擎,您不再需要 Page_Loador 标准页面生命周期的其他事件。 图 1 Web 窗体和 ASP.NET MVC 比较在运行时堆栈。
图 1 快速的运行时堆栈 (单击图像可查看大图)
应该注意 图 1 中的"页面生命周期"框已被折叠以提高可读性,,包括几个其他事件每个。 仍要 ASP.NET MVC 的运行时堆栈更简单,不同之处是由于缺少的一个页面生命周期。 但是,这使得在页请求之间维护可视元素的状态有问题。 可以将状态存储到会话或缓存,但此决定保留给开发人员。
图 2 阐释了 ASP.NET MVC 请求的顺序。
图 2 的 ASP.NET MVC 请求的序列图 (单击图像可查看大图)
MVC 首字母缩写词代表模型-视图-控制器。 但是,您应注意 图 2 描绘该模式不完全匹配,MVC 模式的典型设计。 特别,在原始 MVC 纸张,模型和视图被绑定在一起的 Observer 关系。 在 MVC 模式但,故意松散定义,更重要的是已设计网站时仍然有待。 调整到 Web MVC 它向移动模型在 图 2 ,这也被称为 Model2。 一般情况下,讨论或阅读有关 MVC 时应注意有相当多稍有不同类型,它在宣传资料中。
ASP.NET MVC 的缺陷
使 ASP.NET MVC 表将使用一个简洁的问题分离骞插噣设计,leaner 的运行时堆栈、 HTML 的完全控制、 的可扩展性,unparalleled 的级别和一个工作环境,使,不 penalizes,测试驱动开发 (TDD)。 是 ASP.NET MVC,因此,一个 paradise 对于 Web 开发人员吗?
就像使用 Web 窗体,什么其他一些会发现已作为 ASP.NET MVC 的一个清晰的强度,人可能会看到为弱点。 对于示例,完全控制 HTML,JavaScript 和 CSS ASP.NET MVC 意味着您手动输入 Web 元素。 此问题的许多可以减轻,但是,更多最近的 JavaScript 库甚至不同的视图引擎中的一些。 一般情况下,但,还有不排序的组件模型,以帮助您生成的 HTML,因为在 Web 窗体方法中。 当前,HTML 帮助和用户控件是唯一工具可以利用更快地编写 HTML 的。 鍥犳 ,某些 ASP.NET 开发人员可能会看到 ASP.NET MVC 为采用方面的可用性和生产率向后一步。 另一个点进行有关日常开发,ASP.NET MVC 的影响是它需要一些前期的熟悉 MVC 模式。 您需要知道在控制器和视图中如何协同工作 ASP.NET 实现中。 换而言 ASP.NET MVC 不是一些您可以轻松地了解通过试验。 我的经验,这可能降低平均值 Web 窗体开发人员的工作效率的源。
右侧角度来看
作为结构设计师或开发人员,是至关重要的了解框架结构的区别,以便您可以进行 thoughtful 决定的。 所有在所有 ASP.NET Web 窗体和 ASP.NET MVC 是意义上的一个丰富的团队可以成功使用生成任何 Web 解决方案功能等效的。
将技能、 教育,和团队的态度但,是要记住的要点。 如您可能已经想到自己的大多数功能显示为加号或者框架也可能出现负,反之亦然。 渚嬪的方式 完全控制 HTML,可能是一个人一个 lifesaver 但到另一个任务。 个人,我是 shocked 第一次我看到了在 ASP.NET MVC 中的一个重要的查看网页的内容。 但当我在给客户的应用程序仍然使用 ASP 页中,重要数量也显示在同一页,他免除。 如果辅助功能作为一种严格要求可能想要取得完全控制所显示的 HTML。 这不完全有可能使用 Web 窗体。 欢迎另一方面,如果您正在构建一个粗的数据驱动的应用程序,您将使用一的组数据绑定控件和 statefulness 提供 Web 窗体。
正确,Microsoft 有未定位 ASP.NET MVC 替换为 ASP.NET Web 窗体。 Web 窗体肯定是适合于 Web 应用程序的模式。 一次 MVC 也成功的 Web 应用程序 ; 图案,ASP.NET MVC 确认这已证明拼音文字的侧面上。
结束,在 Web 窗体和 ASP.NET MVC 有专业人员,cons 和结构差异会影响不同级别的。 推广,我要说 Web 窗体而 ASP.NET MVC 是面向 TDD embraces RAD 的基本原理。 进一步,Web 窗体是向模拟一个状态的环境,而 ASP.NET MVC 利用该站点的自然 statelessness 并指导您构建应用程序的松散耦合和本身可测试的搜索引擎友好,向与 HTML 的完全控制网站的抽象。
ASP.NET 的模型完全是什么?
使用 Web 窗体年后, 我识别其缺点,数和 ASP.NET MVC 非常好地址它们: 可测试性、 HTML 控件和问题的分离。 但是,作为一个同样有效的选项,这一次看到 ASP.NET MVC,但我不认为它是为每个 Web 应用程序在银色项目符号。 在我看来,ASP.NET MVC 目前缺少一些用于创建标准 HTML 片段的抽象级别。 HTML 帮助是只有趣试图加速创建 HTML。 我希望看到在不久的将来 MVC 的特定服务器的控件的一个新的生成容易和快速学习和使用作为 Web 窗体的服务器控件,但从回发和视图状态模型完全绑定。 我 hopes 是 System.Web.Mvc.GridView 控件编写一个循环来提供列模板、 服务器端数据绑定的事件和样式选项时生成的 HTML 表中保存我的。 是这样一个 MVC GridView 今天的 Web 窗体 GridView 之差什么? HTML 和 (可选),某些特定于行的 JavaScript,将只发出 MVC GridView,但它不会管理等分页和排序。 分页和排序将被委派到其他的特定控件或普通由开发人员创建的链接。 这种方式,MVC GridView 可以使某些 RAD 风格将 ASP.NET MVC,加快开发的页不 precluding handcrafted 页。
返回根,Web 窗体和 ASP.NET MVC 将密钥区别将是问题的基础的模式。 Web 窗体是基于在"页面控制器"模式的一个模型。 Web 窗体是专门针对 UI 的和居中围绕一页的概念: 页获取输入、 回,和确定浏览器输出。 在开发环境是以便快速与通过向导和丰富的设计器的原型设计因此设计了。 任何用户操作在方法中每一页的代码隐藏类上结束。 在该点但,没有阻止您使用正确的 SoC,并没有真正停止架构师实施模式,如 MVC、 模型的 View-Presenter (MVP) 或甚至模型-视图-视图-模型 (MVVM) 从。
Web 窗体结构不鼓励 SoC,但也不会阻止。 Web 窗体结构使它 seductive 来选择和拖放的控件代码逻辑事件存根无需进一步分离,右,删除数据源 couples 直接对数据库的用户界面的页上的权限。 MVC 既不禁止 blasphemy 在 Web 窗体中 ; 一个,也只是很少的开发人员练习它因为它需要解决 Web 窗体基础结构的很多。
可测试性是一个不同的故事。 Web 窗体不能防止单元测试,但它需要多 disciple 和重复样板代码如何 so.As 长为您的代码您 SoC,可以测试并重复使用演示文稿和业务逻辑的方法。 确保,您可能没有 Visual Studio 项目模板为您创建一个测试项目。 您需要熟悉测试和模拟框架和管理这些项目。 但是,可以完成此操作。 从可测试性角度来看但,真实存在差异 ASP.NET MVC Web 窗体之间。 在 Web 窗体中,您只是没有 ASP.NET MVC 的灵活性。 这是一个真正的限制。 ASP.NET MVC 设计记住框架体系结构指导开发人员编写的代码是天生就可测试,这意味着,独立于上下文的可测试性的或通过拗音接口连接到它。 甚至更重要 ASP.NET MVC 中内部对象是 mockable 它们公开的接口和基类的类。 从测试角度来看是将您的逻辑移到单独的和可轻松地测试类的最佳您可以在 Web 窗体中执行操作。 然后,演示文稿 (ASPX 和代码隐藏) 进行测试: 发送 HTTP 请求,检查结果。 您不能这样 Web 窗体中设置整个 ASP.NET 运行库的旋转不但是。 在 ASP.NET MVC,测试的大多数是确保传递到视图中,数据正确无误。 鍙 ﹀ 的方式 可以模拟设置内部对象,在 genuinely 独立环境中运行测试。
我们还应注意该控制 HTML 和 ASP.NET MVC 的两个优点的 SEO 友好的 URL,可以在 Web 窗体中某种程度上实现。 ASP.NET 3.5 SP1,特别,SEO 为包括 URL 路由和历史 API。 CSS 适配器,相反,是利用试图在 Web 窗体中的 HTML 控件工具。 与 JavaScript,AJAX 框架集成,坦率地讲,不再是 Web 窗体中的问题。
undisputable 事实
Web 窗体和 ASP.NET MVC 不是一个将要替换其他意义上的竞争对手。 必须选择一个,但不同的应用程序可能会强制您做出不同选择。 在结束,就真正像选择一个摩托车一辆汽车之间进行一次旅行时。 每个过程都需要一个的选择,有两个可用的车辆应看到为商机而不是一个 curse。 以下是有关框架的一些信息:
- Web 窗体很难测试。
- ASP.NET MVC 需要管理生成的 HTML 更详细的级别。
- ASP.NET MVC 并不是在 ASP.NET 中获取 SoC,唯一方法。
- Web 窗体使您可以了解所需。
- 可以控制或禁用视图状态。
- Web 窗体被设计为抽象,Web 机器。
- ASP.NET MVC 公开 Web 体系结构。
- ASP.NET MVC 记住设计可测试性和依赖关系注入。
- ASP.NET MVC 将您带到代码的一个更好的设计。
- ASP.NET MVC 年轻并且缺少一个组件模型。
- ASP.NET MVC 不 anti-Web 窗体。
ASP.NET MVC 没有创建替换 Web 窗体,但它的合作伙伴。 ASP.NET MVC 打开的某些 Web 窗体的元素到其自己的内部强度较弱。 但是,SEO,SoC,可测试性问题 (如缺少和 HTML 控件可以避免或缩短 Web 窗体中某些规则和良好的设计但框架本身不提供足够的指导。
一天的末尾
我们曾经有优点和缺点 ASP.NET MVC 和 Web 窗体中。 许多开发人员,但是,似乎支持 ASP.NET MVC,因为它表示唯一 SoC 和可测试性进入自己的应用程序的方法。 是否确实唯一的方法吗? 否。 但是,ASP.NET MVC 使它更容易和自然实现 SoC,并编写更多的可测试代码。 ASP.NET MVC 没有神奇地转换每个开发人员专家架构师并不能防止开发人员编写 bloated 和差设计的代码。 结尾的一天 Web 窗体和 ASP.NET MVC 帮助构建应用程序设计和实现以有效地处理实际的解决方案的复杂性。 没有软件幻存在,无 ASP.NET 平台还支持它。
将您的问题和提出发送 Dino 将为 cutting@microsoft.com.
Dino Esposito IDesign 和该 co-author Microsoft .NET: Architecting Applications for the Enterprise (微软出版社,2008年) 的架构师。 基于在意大利,Dino 是经常在世界各地的行业事件演讲者。 您可以加入在他的博客 weblogs.asp。 网络/despos.