1. 简介
本文档的PDF版本可在此处获取 |HERE|。
本文档中的示例可在此处查看 |HERE|。
本文旨在通过实例介绍 ASP.NET MVC 的核心概念,这是一个基于 .NET 的 Web 框架,为根据 MVC(模型-视图-控制器)模式开发 Web 应用程序提供了框架。
理解本文中的示例几乎不需要任何先决条件。只需具备 C# 语言的基础知识即可。相关内容可参阅文档《C# 语言入门》,网址为 [https://stahe.github.io/zh-csharp-mai-2008/]。 文中提供了一个案例研究,旨在将所学的 ASP.NET MVC 知识付诸实践。该案例使用了 Entity Framework ORM(对象关系映射器)。关于该 ORM 的介绍详见《Entity Framework 5 Code First 入门》文档,网址为 [https://stahe.github.io/zh-ef5cf-oct-2012/]。
本文档中的各种示例可通过 URL [https://stahe.github.io/zh-aspnetmvc-nov-2013/] 以可下载的 ZIP 文件形式获取。
本文档在许多方面尚不完善。若要进一步了解 ASP.NET MVC,可参考以下资料:
- [ref1]:由 Adam Freeman 撰写、Apress 出版的《Pro ASP.NET MVC 4》一书。这是一本非常优秀的书籍。如果该书能免费在线提供且有法语版本,那么本文档便没有存在的必要了。 我建议有条件的人都通过这本书学习 ASP.NET MVC。本书示例的源代码可在 [http://www.apress.com/9781430242369] 免费获取;
- [ref2]:框架官网 [http://www.asp.net/mvc]。您可以在那里找到自学所需的所有资料。法语版本可通过网址 [http://dotnet.developpez.com/mvc/] 获取;
- 专门介绍 ASP.NET 的 [developpez.com] 网站 [http://dotnet.developpez.com/aspnet/ ]。
本文件旨在方便读者在没有电脑的情况下阅读,因此包含大量屏幕截图。
1.1. ASP.NET MVC 在 Web 应用程序中的作用
首先,让我们将 ASP.NET MVC 置于 Web 应用程序开发的背景中。通常情况下,它将基于如下所示的多层架构构建:
![]() |
- [Web] 层是与 Web 应用程序用户直接交互的层。用户通过浏览器显示的网页与 Web 应用程序进行交互。ASP.NET MVC 仅位于这一层,且仅限于此层;
- [业务]层实现应用程序的业务逻辑,例如计算工资或生成发票。该层通过[Web]层获取用户数据,并通过[DAO]层从数据库管理系统(DBMS)获取数据;
- [DAO](数据访问对象)层、[ORM](对象关系映射器)层以及 ADO.NET 连接器负责管理对 DBMS 中数据的访问。[ORM] 层充当 [DAO] 层处理的对象与关系型数据库中表的行和列之间的桥梁。 在 .NET 领域,常用的 ORM 有两种:NHibernate(http://sourceforge.net/projects/nhibernate/)和 Entity Framework(http://msdn.microsoft.com/en-us/data/ef.aspx);
- 这些层的集成可通过依赖注入容器(如 Spring(http://www.springframework.net/))来实现;
下文提供的示例大多仅使用单一层,即 [Web] 层:
![]() |
不过,本文最后将介绍如何构建一个多层Web应用程序:
![]() |
1.2. ASP.NET MVC 开发模型
ASP.NET MVC 通过以下方式实现了 MVC(模型–视图–控制器)架构模式:
![]() |
客户端请求的处理流程如下:
- 请求 - 请求的 URL 通常采用 http://machine:port/contexte/Controlleur/Action/param1/param2/....?p1=v1&p2=v2&... 的形式。[前置控制器] 通过配置文件将请求“路由”到正确的控制器及其内部的正确操作。为此,它会使用 URL 中的 [控制器/操作] 路径。 URL 的其余部分 [/param1/param2/...] 由可选参数组成,这些参数将传递给操作。此处的 MVC 中的“C”指的是 [前端控制器、控制器、操作] 链。如果 [控制器/操作] 路径未指向现有的控制器或操作,Web 服务器将返回请求的 URL 不存在的响应。
- 处理
- 选定的操作可以使用 [前置控制器] 传递给它的参数。这些参数可能来自以下几个来源:
- URL 的 [/param1/param2/...] 路径,
- URL中的[p1=v1&p2=v2]参数,
- 浏览器随请求提交的参数;
- 在处理用户请求时,操作可能需要调用 [业务] 层 [2b]。一旦客户端的请求被处理完毕,可能会触发各种响应。一个典型的例子是:
- 若请求无法正确处理,则返回错误页面
- 否则则返回确认页面
- 操作会指示显示特定的视图 [3]。该视图将显示称为视图模型的数据。这就是 MVC 中的 M。操作将创建此 M 模型 [2c] 并指示显示 V 视图 [3];
- 响应——选定的视图 V 使用操作生成的模型 M 来初始化其必须发送给客户端的 HTML 响应中的动态部分,然后发送该响应。
现在,让我们澄清 MVC Web 架构与分层架构之间的关系。根据我们对模型的定义,这两个概念可能相关,也可能无关。考虑一个单层的 ASP.NET MVC Web 应用程序:
![]() |
如果我们使用 ASP.NET MVC 实现 [Web] 层,那么确实会形成 MVC Web 架构,但并非多层架构。在此情况下,[Web] 层将处理所有事务:呈现、业务逻辑和数据访问。而执行这些工作的正是操作(actions)。
现在,让我们考虑一种多层 Web 架构:
![]() |
[Web]层可以不依赖框架,也不遵循MVC模型来实现。这样我们便拥有了多层架构,但Web层并未实现MVC模型。
因此,上层的 [Web] 层可以使用 ASP.NET MVC 实现,从而形成一个具有 MVC 风格 [Web] 层的分层架构。完成这一步后,我们可以将该 ASP.NET MVC 层替换为经典的 ASP.NET 层(WebForms),同时保持其余部分(业务逻辑、DAO、ORM)不变。 这样,我们就得到了一种分层架构,其[Web]层不再基于MVC。
在 MVC 中,我们曾提到 M 模型即 V 视图所呈现的数据集。关于 MVC 中 M 模型的另一种定义如下:
![]() |
许多作者认为,位于 [Web] 层右侧的部分构成了 MVC 中的 M 模型。为避免歧义,我们可以将:
- 当指代[Web]层右侧的所有内容时,称之为领域模型
- 当指代视图 V 所显示的数据时,称之为视图模型
下文中,“M模型”一词将专指视图V的模型。
1.3. 使用的工具
接下来,我们将使用(截至 2013 年 9 月)Visual Studio 2012 的 Express 版本:
- [http://www.microsoft.com/visualstudio/fra/products/visual-studio-express-for-windows-desktop ] 用于桌面应用程序;
- [http://www.microsoft.com/visualstudio/fra/products/visual-studio-express-for-Web ] 用于 Web 应用程序。
若要安装这些产品的最新版本,您可以使用微软的 [Web Platform Installer] (http://www.microsoft.com/Web/downloads/platform.aspx)。
此外,请使用 Google 的 Chrome 浏览器 (http://www.google.fr/intl/fr/chrome/browser/)。安装 [ 高级 REST 客户端] 扩展程序 ( )。具体操作如下:
- 使用 Chrome 浏览器访问 [Google 应用商店] (https://chrome.google.com/webstore);
- 搜索 [Advanced Rest Client] 应用:

- 随后即可下载该应用:

- 要获取该应用,您需要创建一个 Google 账户。随后 [Google Web Store] 会要求您进行确认 [1]:
![]() |
- 在[2]处,已添加的扩展程序可在[应用程序]选项[3]下找到。该选项会显示在您通过浏览器创建的每个新标签页(CTRL-T)中。
1.4. 示例
大多数学习示例仅限于 Web 层:
![]() |
本教程完成后,我们将展示一个多层Web应用程序:
![]() |









