Skip to content

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 有两种:NHibernatehttp://sourceforge.net/projects/nhibernate/)和 Entity Frameworkhttp://msdn.microsoft.com/en-us/data/ef.aspx);
  • 这些层的集成可通过依赖注入容器(如 Spring(http://www.springframework.net/))来实现;

下文提供的示例大多仅使用单一层,即 [Web] 层:

不过,本文最后将介绍如何构建一个多层Web应用程序:

1.2. ASP.NET MVC 开发模型

ASP.NET MVC 通过以下方式实现了 MVC(模型–视图–控制器)架构模式:

客户端请求的处理流程如下:

  1. 请求 - 请求的 URL 通常采用 http://machine:port/contexte/Controlleur/Action/param1/param2/....?p1=v1&p2=v2&... 的形式。[前置控制器] 通过配置文件将请求“路由”到正确的控制器及其内部的正确操作。为此,它会使用 URL 中的 [控制器/操作] 路径。 URL 的其余部分 [/param1/param2/...] 由可选参数组成,这些参数将传递给操作。此处的 MVC 中的“C”指的是 [前端控制器、控制器、操作] 链。如果 [控制器/操作] 路径未指向现有的控制器或操作,Web 服务器将返回请求的 URL 不存在的响应。
  1. 处理
  • 选定的操作可以使用 [前置控制器] 传递给它的参数。这些参数可能来自以下几个来源:
  • URL 的 [/param1/param2/...] 路径,
  • URL中的[p1=v1&p2=v2]参数
  • 浏览器随请求提交的参数;
  • 在处理用户请求时,操作可能需要调用 [业务] 层 [2b]。一旦客户端的请求被处理完毕,可能会触发各种响应。一个典型的例子是:
  • 若请求无法正确处理,则返回错误页面
  • 否则则返回确认页面
  • 操作会指示显示特定的视图 [3]。该视图将显示称为视图模型的数据。这就是 MVC 中的 M。操作将创建此 M 模型 [2c] 并指示显示 V 视图 [3];
  1. 响应——选定的视图 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 版本:

若要安装这些产品的最新版本,您可以使用微软的 [Web Platform Installer] (http://www.microsoft.com/Web/downloads/platform.aspx)。

此外,请使用 Google 的 Chrome 浏览器 (http://www.google.fr/intl/fr/chrome/browser/)。安装 [ 高级 REST 客户端] 扩展程序 ( )。具体操作如下:

Image

  • 随后即可下载该应用:

Image

  • 要获取该应用,您需要创建一个 Google 账户。随后 [Google Web Store] 会要求您进行确认 [1]:
  • 在[2]处,已添加的扩展程序可在[应用程序]选项[3]下找到。该选项会显示在您通过浏览器创建的每个新标签页(CTRL-T)中。

1.4. 示例

大多数学习示例仅限于 Web 层:

本教程完成后,我们将展示一个多层Web应用程序: