個人
Asp.Net 全面解析
來自 http://www.tracefact.net/的文章
[键入作者姓名]
2010-6-17
本系列文章主要从控制器、视图和数据模型这 3 个 Asp.Net MVC 基础组建来讲解。
Asp.Net MVC 概述
原文链接:http://www.asp.net/learn/mvc/
1. ASP.NET MVC 概览
模型-视图-控制器(Model-View-Contoller, MVC)架构模式将应用程序分为了三个主要的
组件:模型,视图和控制器。ASP.NET MVC 框架为 ASP.NET Web 表单模式提供了另一种开发模式――
基于 MVC 的 Web 应用程序。ASP.NET MVC 框架是一个轻量的、高度可测试的表现层框架(与基于
表单的 Web 应用程序相同),它继承在了现有的 ASP.NET 功能之中,例如模板页和基于 Membership
的验证。MVC 框架定义在了 System.Web.Mvc 命名空间中,并且是必不可少的,由部分 System.Web
命名空间支持。
MVC 是一个许多开发者都熟悉的、标准的设计模式。一些类型的 Web 应用程序将从 MVC 框
架中受益。其他一些应用程序将会继续使用基于 Web 表单和 Postback 的传统 ASP.NET 应用程序
模式。还有一些 Web 应用程序将会将这两种方法结合;这两种方式互不排斥。
MVC 框架包含下面的组件:
图 1:调用一个需要参数值的控制器动作
模型:模型对象是应用程序中实现了数据领域(data domain)逻辑的部分。通常,模型对
象从数据库中获取模型状态,并且将模型状态保存至数据库。举个例子,一个 Product 对象可能
从数据库中获取信息,对它进行操作,然后将更新后的信息写回 SQL Server 中的 Products 表。
在小型的应用程序中,模型通常是一个概念上的划分而非一个实际的划分。举个例子,如
果应用程序只是读取 DataSet 然后发送给视图,应用程序没有一个实际的模型层和相关的类。在
这种情况下,DataSet 就承担了模型对象的角色。
视图:视图是应用程序中显示用户界面(UI)的组件。典型地,这个 UI 基于模型数据创建。
举个例子,Products 表的编辑视图基于 Products 对象的状态显示了文本框、下拉列表,以及复
选框。
控制器:控制器是处理用户交互的组件,它与模型协作,并且最终选择一个要呈现的视图
来显示用户界面。在 MVC 应用程序中,视图仅仅显示信息;控制器处理并且响应用户输入和交互。
举个例子,控制器处理查询字符串值,并且将这些值传递给模型,模型再使用这些参数查询数据
库。
MVC 模型帮助创建这样的应用程序,它能够将应用程序的各个方面区分开(输入逻辑、业
务逻辑,以及 UI 逻辑),同时提供这些元素之间的松耦合。这个模式指定了每一种逻辑应该位
于应用程序的哪个位置。UI 逻辑属于视图。输入逻辑属于控制器。业务逻辑属于模型。这种分
隔有助于你在创建应用程序时管理复杂性,因为它能够让你在一次将精力集中于实现的某一方面。
举个例子,你可以集中在视图,而不依赖于业务逻辑。
除了管理复杂性以外,测试应用程序时 MVC 模式比基于 Web 表单的 ASP.NET 应用程序要简
单得多。举个例子,在一个基于 Web 表单的 ASP.NET 应用程序中,一个类既用于显示输出,也用
于响应用户输入。为基于 Web 表单的 ASP.NET 应用程序编写自动测试程序是很复杂的,因为要测
试每个页面,你必须初始化页面类,它的所有子控件,以及应用程序中其他有所依赖的类。因为
为了运行页面初始化了这么多的类,所以编写专用于应用程序单独部分的测试就变得很困难了。
测试基于 Web 表单的 ASP.NET 应用程序因此比测试 MVC 应用程序更加难以实施。除此以外,基于
Web 表单的 ASP.NET 应用程序需要一个 Web 服务器。MVC 框架将组件进行了解耦,并且大量使用
了接口,使得测试独立于框架其他部分的组件成为可能。
MVC 应用程序三个主要组件之间的松耦合也提升了并行开发的程度。举个例子,一个开发
者可以开发视图,第二个开发者可以开发控制器逻辑,而第三个开发者可以将精力集中于模型中
的业务逻辑。
1.1 决定如何创建 MVC 应用程序
你必须认真考虑是使用 ASP.NET MVC 框架实现 Web 应用程序,还是使用 ASP.NET Web 表单
模型来实现 Web 应用程序。MVC 框架并没有取代 Web 表单模型;你可以选择使用 MVC 框架(如果
你已经有基于 Web 表单的应用程序,它们可以继续像往常一样工作)。
对于一个特定的 Web 站点,在你决定使用 MVC 框架或者 Web 窗体模型之前,权衡一下每一
种方式的优势。
1.1.1 基于 MVC 的 Web 应用程序的优势
ASP.NET MVC 框架提供了下面的优点:
通过将应用程序分为了模型、视图和控制器,它在管理复杂性方面更加的简单。
它不适用视图状态或者基于服务器的表单。对于那些想要完全控制应用程序行为的开
发者来说,MVC 框架是很理想的。
通过一个控制器,它使用了 Front Controller 模式来处理对 Web 应用程序的请求。
这允许你设计出一种可以支持丰富的路由结构的应用程序。关于 Front Controller
的更多信息,可以查看 MSDN 网站。
它为测试驱动开发(test-driven development, TDD)提供了更好的支持。
对于那些由大型开发者和设计者所支持的 Web 应用程序来说,它运作得很好,能够对
应用程序的行为提供更高层次的控制。
1.1.2 基于 Web 窗体的 Web 应用程序的优势
基于 Web 窗体的框架提供了下面的优势:
它支持在 HTTP 上保存状态的事件模型,这有益于 line-of-business 的 Web 应用程序
开发。基于 Web 窗体的应用程序提供了大量的事件,它们被数以百计的服务器控件
所支持。
它使用了一个 Page Controller 模式来为单个页面添加功能。关于 Page Controller
的更多信息,可以参考 MSDN 网站。
它使用了视图状态或者基于服务器的表单,这使得管理状态信息更加容易。
对于那些想要利用大量的用于快速应用程序开发组件的小型 Web 开发者和设计者团
队来说,它工作得很好。
总的来说,对于应用程序开发来说,它更加的简单,因为组件(Page 类,控件等)
已经紧密地集成了,并且通常比 MVC 需要编写更少的代码。
1.2 ASP.NET MVC 框架的功能
ASP.NET MVC 框架提供了下面的功能:
应用程序任务的分离(输入逻辑、业务逻辑和用户界面逻辑),可测试性,以及默认
的测试驱动开发。MVC 框架中的所有核心契约都是基于接口的,并且可以使用 mock
对象进行测试,mock 对象是模拟的对象,它们可以模仿应用程序中实际对象的行为。
你可以对应用程序进行单元测试,而不需要在 ASP.NET 进程中运行控制器,这使得
单元测试更快速也更灵活。
它是一个可扩展和可插入的框架。ASP.NET MVC 框架的组件设计为可以很容易地替换
或者定制。你可以嵌入你自己的视图引擎、URL 路由策略、动作方法参数序列化,
以及其他组件。ASP.NET MVC 框架也支持使用依赖注入(Dependency Injection,
DI)和控件倒置(Inversion of Control,IOC)容器模型。DI 允许你将对象注入
到类中,而不是基于类来创建对象本身。IOC 制定了如果一个对象需要另一个对象,
第一个对象应该由外部源,例如配置文件,获得第二个对象。这使得测试更加容易。
一个强大的 URL 映射组件,允许你创建拥有着易于理解和便于搜索的 URL 的应用程序。
URL 并不需要包含文件名扩展,并且设计为有利于搜索引擎优化(SEO)和表现状态
传输(representational state transfer)的 URL 命名模式。
支持在现有的 ASP.NET 页面(.aspx 文件)、用户控件(.ascx 文件)和模板页(.master
文件)文件中使用标记来作为视图模板。你可以与 ASP.NET MVC 框架一起使用现有
的 ASP.NET 功能,例如嵌套模板页,in-line 表达式(<%%>),声明式服务器控件、
模板、数据绑定、本地化等等。
支持现有的 ASP.NET 功能。ASP.NET MVC 允许你使用例如表单验证和 Windows 验证、
URL 授权、成员资格和角色、输出和数据缓存、会话和档案状态管理、健康监视器、
配置系统和 Provider 架构这些 ASP.NET 的功能。
2. 理解 MVC 应用程序执行过程
对基于 ASP.NET MVC 的 Web 应用程序发出的请求首先通过 UrlRoutingModule 对象,它是一
个 Http 模块。这个模块对请求进行解析,并且执行路由选择。UrlRoutingModule 对象选择与当
前请求所匹配的第一个路由对象(路由对象十一哥实现了 RouteBase 的类,典型地是是一个 Route
类的实例)。如果没有路由匹配,UrlRoutingModule 对象什么也不做,并且让请求回退到通常
的 Asp.Net 或者 IIS 请求处理。
从所选择的 Route 对象中,UrlRoutingModule 对象获取与 Route 对象相关的 IRouteHandler
对象。典型地,在一个 MVC 应用程序中,这是一个 MvcRouteHandler 的实例。IRouteHandler 实
例创建了一个 IHttpHandler 对象,并且向它传递 IHttpContext 对象。默认情况下,MVC 的
IHttpHandler 实例是一个 MvcHandler 对象。MvcHandler 对象然后选择控制器,该控制器最终处
理请求。
NOTE:当 ASP.NET MVC 应用程序运行在 IIS7.0 中时,MVC 项目对文件的扩展名没有要求。
然而,在 IIS6.0 中,handler 要求你将.mvc 文件名后缀映射到 ASP.NET ISAPI DLL。
模块和处理器(handler)是 ASP.NET MVC 框架的入口点。它们执行下面的动作:
在 MVC Web 应用程序中选择合适的控制器。
获取一个特定的控制器实例。
调用控制器的 Execute 方法。
下面的表列出了 MVC Web 项目的执行阶段。
阶段 细节
收到应
用程序
的第一
个请求
执行路
由
创建
MVC 请
求处理
器
在 Global.asax 文件中,Route 对象添加到 RouteTable 对象中。
UrlRoutingModule 模块使用 RouteTable 集合中的第一个匹配的
Route 对象来创建 RouteData 对象,该对象然后被用来创建
RequestContext(IHttpContext)对象。
MvcRouteHandler 对象创建一个 MvcHandler 类的实例,并且将
RequestContext 实例传递给它。
创建控
制器
调用动
作
执行结
果
MvcHandler 对象使用 RequestContext 实例来识别出
IControllerFactory 对象(典型地,是一个
DefaultControllerFactory 类的实例),来创建控制器实例。
大多数控制器都继承自 Controller 基类。对于这些控制器来说,与
控制器相关的 ControllerActionInvoker 对象决定调用控制器类的哪
一个动作方法,然后调用它。
一个典型的动作方法可能会接收用户输入,准备合适的响应数据,然
后通过返回一个结果类型来执行结果。内置的、可以执行的结果包括
下面这些:ViewResult(呈现一个视图,是最常使用的结果类型),
RedirectToRouteResult、RedirectResult、ContentResult、
JsonResult 和 EmptyResult。
3. 理解模型、视图和控制器
这篇教程将为你提供 ASP.NET MVC 模型、视图、控制器的高层次概览。换言之,它解释了
ASP.NET MVC 中的“M”、“V”和“C”。
在读完本教程之后,你应该能够理解 ASP.NET MVC 应用程序中的各个不同部分是如何一起
工作的。你也应该能够理解 ASP.NET MVC 应用程序与 ASP.NET Web 窗体应用程序和动态服务器页
面应用程序在构架上有何不同。
3.1 范例 ASP.NET MVC 应用程序
Visual Studio 用于创建 ASP.NET MVC Web 应用程序的默认模板包括了一个极其简单的范
例应用程序,可以使用它来理解 ASP.NET MVC 应用程序的各个部分。我们将会在这篇教程中利用
这个简单的应用程序。
你可以通过启动 Visual Studio2008,并且在菜单中选择“File(文件)”、“New Project
(新建项目)”来使用 MVC 模板创建一个新的 ASP.NET MVC 应用程序(如图 1)。在“新建项目”
对话框,在项目类型下选择你喜欢的编程语言(Visual Basic 或者 C#),并且在模板下选择
ASP.NET MVC Web 应用程序。点击“确定”按钮。
图 1 - 新建项目对话框
当你创建一个新的 ASP.NET MVC 应用程序时,将会出现“创建单元测试项目(Create Unit
Test Project)”对话框(如图 2)。这个对话框允许你在解决方案下创建一个独立的项目用于
测试你的 ASP.NET MVC 应用程序。选择选项“No, do not create a unit test project(否,
不要创建单元测试项目)”,并且点击“OK(确定)”按钮。
图 2 - 创建单元测试对话框
在新的 ASP.NET MVC 应用程序创建好之后。你将会在解决方案浏览器窗口中看到几个文件
夹和文件。特别地,你将会看到三个文件夹,名字是 Models、Views 和 Controllers。正如你从
文件夹的名称可以推测出的,这三个文件夹包含了实现了模型、视图和控制器的文件。
如果你展开 Controller 文件夹,你应该会看到一个命名为 HomeController.cs 的文件。如
果你展开 Views 文件夹,你应该看到两个子文件夹,名称是 Home 和 Shared。如果你展开 Home
文件夹,你将会再次看到两个文件,名称是 About.aspx 和 Home.aspx(见图 3)。这些文件组成
了这个包含在默认 ASP.NET MVC 模板中的范例应用程序。
图 3 - 解决方案浏览器窗口
你可以通过选择菜单项“Debug(调试)”、“Start Debugging(启动调试)”来运行这
个范例应用程序。除此以外,你可以点击 F5 键。
当你第一次运行 ASP.NET 应用程序,将会出现图 4 中的对话框,建议你开启调试模式。点
击“确定”按钮将会运行应用程序。