本教程对 ASP.NET MVC 的模型、视图和控制器提供了高层面的概述。换句话说,它解释了 ASP.NET MVC 中的 ‘M’、‘V’和‘C’。

阅读本教程后,您将会了解 ASP.NET MVC 应用程序的不同部分如何协同工作。您还将了解 ASP.NET MVC 应用程序的层次结构与 ASP.NET Web Forms 应用程序或 Active Server Pages 应用程序层次结构的不同之处。

示例 ASP.NET MVC 应用程序

用于创建 ASP.NET MVC Web 应用程序的默认 Visual Studio 模板包括一个非常简单的示例应用程序,可以使用该应用程序了解 ASP.NET MVC 应用程序的各个不同部分。在本教程中,我们将利用这个简单的应用程序。

通 过启动 Visual Studio 2008 并选择菜单项 File,New Project,使用 ASP.NET MVC 模板可以创建新的 ASP.NET MVC 应用程序(如图 1 所示)。在 New Project 对话框中,在 Project Types 下选择自己偏爱的编程语言(Visual Basic 或 C#),然后在 Templates 下选择 ASP.NET MVC Web Application。单击 OK 按钮。

图 1:New Project 对话框(单击查看大图

在创建新的 ASP.NET MVC 应用程序时,将出现 Create Unit Test Project 对话框(如图 2 所示)。通过这个对话框可以在自己的解决方案中创建单独的项目,以测试 ASP.NET MVC 应用程序。选择选项 No, do not create a unit test project,然后单击OK按钮。

图 2:创建 Unit Test 对话框(单击查看大图

创 建新的 ASP.NET MVC 应用程序后,您将可以在 Solution Explorer 窗口中看到若干个文件夹和文件。具体地说,您将可以看到三个文件夹,名称分别为 Models、Views 和 Controllers。可以从文件夹名称中猜出,这些文件夹包含用于实现模型、视图和控制器的文件。

如果展开 Controllers 文件夹,则应该看到名称为 HomeController.cs 的文件。如果展开 Views 文件夹,则应该看到两个名称为 Home 和 Shared 的子文件夹。如果展开 Home 文件夹,则将看到两个其他的文件,名称为About.aspxHome.aspx(如图 3 所示)。这些文件组成了默认 ASP.NET MVC 模板中包含的示例应用程序。

通过选择菜单选项 Debug, Start Debugging,可以运行示例应用程序。也可以按 F5 键运行。

在第一次运行 ASP.NET 应用程序时,将出现图 4 中的对话框,建议启用调试模式。单击 OK 按钮运行应用程序。

图 4:Debugging Not Enabled 对话框(单击查看大图

在 运行 ASP.NET MVC 应用程序时,Visual Studio 将在 Web 浏览器中启动应用程序。示例应用程序由两个页面组成:Index 页面和 About 页面。当应用程序第一次启动时,将出现 Index 页面(如图 5 所示)。通过单击应用程序右上方的菜单链接可以导航至 About 页面。

图 5:Index 页面(单击查看大图

请注意浏览器地址栏中的 URL。在单击 Home 菜单链接时,浏览器地址栏中的 URL 更改为 /Home。在单击 About 菜单链接时,浏览器地址栏中的 URL 更改为 /About

如果关闭浏览器窗口并返回 Visual Studio,则找不到名称为 Home 或 About 的文件。这些文件不存在。这是怎么回事呢?

URL 和页面并不是对等的

在 构建传统的 ASP.NET Web Forms 应用程序或 Active Server Pages 应用程序时,URL 和页面是一一对应的。如果从服务器上请求名称为 SomePage.aspx 的页面,则硬盘上最好有名称为 SomePage.aspx 的页面。如果 SomePage.aspx 文件不存在,则将出现 404 – Page Not Found 错误。

相反,在构建 ASP.NET MVC 应用程序时,在浏览器地址栏中键入的 URL 和应用程序中的文件不存在对应关系。在 ASP.NET MVC 应用程序中,URL 对应的是控制器操作,而不是硬盘上的页面。

在 传统的 ASP.NET 或 ASP 应用程序中,浏览器请求是映射到页面上的。在 ASP.NET MVC 应用程序中,浏览器请求是映射到控制器操作的。ASP.NET Web Forms 应用程序关注的是内容。相反,ASP.NET MVC 应用程序关注的是应用程序逻辑。

了解 URL 路由

浏览器请求通过一项名为 URL 路由的 ASP.NET MVC 功能映射到控制器操作。URL 路由将进入的请求发送给控制器操作。

URL 路由使用路由表处理进入的请求。此路由表在应用程序第一次启动时创建。路由表在 Global.asax 文件中设置。默认的 MVC Global.asax 文件包含在程序清单 1 中。

程序清单 1 Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
public class GlobalApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = ""}
);
}

protected void Application_Start()
{ RegisterRoutes(RouteTable.Routes); } } }

当 ASP.NET 应用程序第一次启动时,调用 Application_Start() 方法。在程序清单 1 中,该方法调用 RegisterRoutes()RegisterRoutes() 方法创建默认的路由表。

默认的路由表中包含一个路由。该默认路由将所有进入的请求拆分为三个单元(URL 单元是正斜杠之间的所有内容)。第一个单元映射到控制器名称,第二个单元映射到操作名称,最后一个单元映射到传递给操作名称 ID 的参数。

例如,考虑下面的 URL:

/Product/Details/3

此 URL 被解析为如下三个部分:

Controller = ProductController

Action = Details

Id = 3

请注意,前缀控制器被附加到控制器参数的末端。这只是 MVC 的一个特殊之处。

默认路由包括所有三个单元的默认值。默认控制器是 HomeController,默认操作是 Index,而默认 ID 是一个空字符串。请观察这些默认值,考虑如何解析下面的 URL:

/Employee

此 URL 被解析为如下三个参数:

Controller = EmployeeController

Action = Index

Id = “”

最后,如果打开 ASP.NET MVC 应用程序而不提供任何 URL(例如 http://localhost/),那么 URL 将被解析为:

Controller = HomeController

Action = Index

Id = “”

请求将被发送到 HomeController 类上的 Index() 操作。

了解控制器

控制器负责控制用户与 MVC 应用程序的交互方式。控制器决定在用户发出浏览器请求时向用户发送什么样的响应。

控制器只是一个类(例如,Visual Basic 或 C# 类)。示例 ASP.NET MVC 应用程序包括一个名称为 HomeController.cs 的控制器,该控制器位于 Controllers 文件夹内。HomeController.cs 的内容如程序清单 2 所示。

程序清单 2 HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}

public ActionResult About()
{
ViewData["Title"] = "About Page";
return View();
}
}
}

请注意,HomeController 有两个方法,名称为 Index()About()。这两个方法对应于控制器公开的两个操作。URL /Home/Index 调用 HomeController.Index() 方法,而 URL /Home/About 调用 HomeController.About() 方法。

控制器中的任何公共方法都作为控制器操作被公开。请小心对待它们。这意味着通过向浏览器输入正确的 URL 来访问 Internet 的任何人都可以激活包含在控制器中的任何公共方法。

了解视图

HomeController 类公开的两个控制器方法 Index()About() 都返回了一个视图。视图包括发送到浏览器的 HTML 标记和内容。在使用 ASP.NET MVC 应用程序时,视图就等于页面。

必须在正确的位置创建视图。HomeController.Index() 操作返回位于以下路径的视图:

\Views\Home\Index.aspx

HomeController.About() 操作返回位于以下路径的视图:

\Views\Home\About.aspx

总之,如果要为控制器操作返回视图,则需要在 Views 文件夹中使用与控制器相同的名称创建子文件夹。在子文件夹中,必须创建与控制器操作名称相同的 .aspx 文件。

程序清单 3 中的文件包含 About.aspx 视图。

程序清单 3 About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication1.Views.Home.About"%>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
<h2>About Us</h2>
<p>
TODO: Put <em>about</em> content here.
</p>
</asp:Content>

如果忽略程序清单 3 中的第一行,则其余大多数视图的内容都由标准的 HTML 组成。在此处,可以通过输入任何您想要的 HTML 修改视图的内容。

视 图非常类似于 Active Server Pages 或 ASP.NET Web Forms 的页面。视图包括 HTML 内容和脚本。可以使用您偏爱的 .NET 编程语言(如 C# 或 Visual Basic .NET)编写脚本。使用脚本显示动态内容,如数据库中的数据。

了解模型

我们已经讨论了控制器和视图。要讨论的最后一个主题是模型。什么是 MVC 模型?

MVC 模型包含所有视图或控制器不包含的应用程序逻辑。模型应该包含所有应用程序业务逻辑和数据库访问逻辑。例如,如果您正在使用 LINQ to SQL 访问数据库,那么您将在 Models 文件夹中创建 LINQ to SQL 类(dbml 文件)。

视图应该只包含与生成用户界面相关的逻辑。控制器应该只包含要求返回正确视图或将用户重定向到另一操作所需的最小逻辑。其他所有内容都应包含在模型中。

总之,应该努力实现高效模型和简化控制器。控制器方法应该只包含几行代码。如果控制器操作过长,则应该考虑将逻辑移动到 Models 文件夹中的一个新类中。

总结

本教程就 ASP.NET MVC Web 应用程序的各个不同部分提供了高水平的概述。您学习了 URL 路由如何将进入的浏览器请求映射到特定控制器操作。您还学习了控制器如何协调视图返回到浏览器的方式。最后,学习了模型如何包含应用程序业务和数据库访问逻辑。

 posted on 2010-05-07 10:52  dongpo  阅读(217)  评论(0编辑  收藏  举报