ASP.NET MVC 或 Classic ASP.NET - 如何选择






4.29/5 (7投票s)
本文讨论了 Web 表单模型和 MVC 模型。
引言
MVC(模型-视图-控制器)对于 ASP.NET 开发者来说是新概念。虽然它已经存在一年多了(CTP 版本于 2007 年 12 月 12 日发布),但它突然引起了市场的轰动。现在大家都在谈论 ASP.NET MVC。所以我想写一篇关于它的文章,希望这能帮助那些试图学习微软新框架的人。哦...我说“框架”了吗?我们来看看。
目标
你可以在互联网上找到很多关于新框架的文章。本文试图传达的是,在现有的 ASP.NET 模型(主要是 Web Forms)之上,何时决定使用这个框架... 这将有助于做出决策。
什么是 MVC??
正如我之前所说,这是微软提供的一个新框架,用于在 .NET 平台上设计和开发新一代的 Web 应用程序。去维基百科、谷歌搜索,你会发现这是一个架构设计模式。之所以称之为新一代,是因为经典 ASP.NET 页面的工作模式与此不同。
这是一种框架方法论,将应用程序的实现划分为三个组件角色:模型、视图和控制器。
- 模型(Models):这些是应用程序中负责维护状态的组件。例如,一个模型映射到一个数据库表,表中的条目代表该表的状态。
- 视图(Views):这些是负责显示应用程序用户界面的组件。视图从模型中提取必要的信息,并渲染用户界面来显示它。
- 控制器(Controllers):这些是负责处理最终用户交互、更新模型以反映应用程序状态的变化,以及最后选择一个视图来渲染以显示 UI 的组件。这是框架的核心。
为什么选择 MVC,这个新框架?
现在,一个大问题是,为什么我们需要一个全新的框架和架构来开发 Web 应用程序?我们难道不满意微软已证明半个多世纪的技术——Web Forms(经典的.aspx页面)——来做同样的工作吗?让我们看看。
还记得 ASP.NET 2.0 学习的初期,人们倾向于将表示层与数据访问层和业务逻辑层混在一起。尤其是,我记得 `sqldataSource` 控件嵌入到 ASP.NET 服务器控件中。看看这个

这样开发的 Web 应用程序维护起来非常困难。而且它们肯定难以进行适当的测试。哦,是的,你有没有试过测试完整的 ASP.NET 应用程序?除非你调整运行时环境,否则是不可能的。你可以测试你分离的 BLL 或 DAL 中的类,但不能测试 UI。这只是一个例子,还有很多类似的。所以你的老板会让你阅读关于最佳实践、设计模式的文章,以便你可以正确地分离层,从而使其可重用、可测试和可维护。请谷歌搜索“关注点分离”来理解。
MVC 确保了数据模型和用户界面之间的清晰分离,使得对用户界面的更改不会影响数据处理。同时,数据模型和相关的访问代码可以重构,而无需相应地更改用户界面。MVC 框架应被视为 Web Forms 的替代方案。有了 MVC,我们就回到了人们只用 HTML 设计网页的时代,回到了 Web 的无状态行为。在 MVC 中,你可以完全控制 HTML,这对程序员来说是件好事。Web Forms 之所以流行,是因为它们能够抽象 HTML,但这在需要浏览器兼容性和与 JavaScript 框架集成时就成了一个问题。
MVC 不支持回发(post back)和视图状态(view state)(这是导致页面性能低下的罪魁祸首),它不像 Web Forms 那样将 URL 映射到服务器上的特定物理文件。在 MVC 中,它只是一个逻辑映射。所以在 MVC 中,你可以有自定义格式,引擎会负责正确渲染。它是如何做到的------------为这个,请等待查看我下一篇关于 HttpHandlers 和它们如何在 MVC 中处理事物的文章-----------目前请记住,它是一个集中化的 HttpHandler 工厂,负责处理请求。这个 HTTP Handler 分析 URL 的语法,并将其映射到一个称为控制器的特殊服务器组件。
模型和控制器只是简单的*.cs文件,包含接口、类、方法……视图在这里是最有趣的,它是可插拔的。这意味着你可以使用.aspx、.ascx页面来渲染你的控件和文本,但你也可以创建自己的视图引擎来渲染内容,并且你可以为你的文件名设置扩展名为*.abcde,HttpHandler 会处理它。例如,你可以看到一个截图,展示我们如何使用基于 XSLT 的视图引擎来渲染我们的内容。你也可以在这里使用其他视图引擎。MVCContrib库包含 4 个替代视图引擎:Brail、NHaml、NVelocity 和 XSLT。

不要试图理解这个。这是我们在组织中使用的。我会专门写一篇文章,讲解如何编写自己的视图引擎。这有点难,但在那之前,会有一系列文章。
好的,我们之前讨论了回发、视图状态和渲染引擎。在 MVC 中,默认的引擎是 Web Forms 视图引擎,这就是为什么你的 MVC 框架中会有.aspx和.ascx文件。所以你可以在你的页面中使用服务器控件,拥有事件处理程序并渲染内容。那么问题来了,为什么还要 MVC 呢?再说一遍。好的,你可以拥有所有这些,但在 MVC 中没有视图状态来保存服务器控件的状态。当然,你可以通过会话、缓存对象等来解决这个问题。如果 MVC 没有服务器控件,那怎么办?我们只有 HTML 控件。那么我们如何像在 ASP.NET 中那样进行 RAD(快速应用程序开发)呢?在这种情况下,我们有 HTML helpers,我热切期待任何第三方或微软能为 MVC 框架的快速开发提供一些控件。在 VS 2008 中开发 MVC 应用程序时,你可以看一下。我这里使用了 scott gu 等人编写的 nerddinner 的例子。他还有一个免费的书,是应用程序的演练,附有代码示例。尽管书中提供的代码需要一些修正才能在生产环境中正确运行,但它几乎是一个你可以从头开始构建的完整应用程序。错误都很小。
这就是其中一个 aspx 页面的样子,它没有代码隐藏文件(分层分离)。

所以,页面上通常有什么?无非就是 HTML 控件和带参数的链接。因此,与 ASP.NET 页面不同,这些页面对搜索引擎友好,并且在搜索引擎中排名靠前。注意:MVC 没有页面生命周期概念。
在我讨论其他话题或总结文章之前,让我们谈谈 MVC 的 TDD(测试驱动开发)方面。正如我们所见,要为完整的 ASP.NET 应用程序实现测试驱动开发的方法很困难,但对于 MVC 应用程序则很容易。由于所有三个角色(M-V-C)都进行了清晰的控制分离,因此很容易测试整个应用程序,而且还可以从应用程序本身注入所需的测试数据。请谷歌搜索“依赖注入框架”和“模拟框架”。
如何选择
一些可以帮助你的要点
场景 | 如何选择?? | 备注 |
你的开发人员喜欢从工具箱中拖放控件,而原始 HTML 对他们来说是噩梦 | Web Forms | 经典的 ASP.NET 控件是对 HTML 的抽象,带有“runat”服务器属性。 |
你的应用程序需要花哨的视觉控件来显示数据。即使它需要像 Gridview 这样的东西 |
Web Forms | MVC 只有 HTML helpers。其中一些是
而且你的选择不多。我们从来不想在 HTML 控件周围使用 |
你想在系统/框架中实现控件分离,而且无需烦恼 | MVC | SOC(关注点分离)是这个框架的架构。使用 Web Forms,你可以实现 SOC,但你需要在编写代码时自己遵循一些最佳实践。 |
你想从一开始就测试你应用程序的每个组件,而无需连接数据库 | MVC | MVC 在设计时就考虑了可测试性。 |
如果我遗漏了任何主要的点,请告诉我。 | Web Forms 已经成熟,而 MVC 还很年轻,缺乏组件模型。但毋庸置疑,它会引导你走向良好的代码设计。 |
结论
我知道这并非全部,而且也许我没有把事情说清楚。我只是试图对这两种模型及其一些特性进行概述。希望这有助于找到这两种模型之间的界限。所以,为了总结,我们目标是选择什么,你需要决定。如果是一个高度数据驱动的网站,那么 MVC 可能不适合。但如果它是一个数据驱动的网站,但对数据显示没有花哨的要求或类似的需求,那么对于其他类型的开发,MVC 是一个不错的选择。但在选择其中任何一个之前,架构师需要理解两者的底层方法论。这只是一个识别这些内容的小尝试。
谢谢。
请发送邮件至 debiprasad.baral@gmail.com 以获取任何反馈,以便改进本文。
历史
- 2009 年 7 月 31 日:初始发布