ASP.NET MVC 3.0,三: 初识MVC的Url映射潜规则Routing

ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要

ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0开发环境

ASP.NET MVC 3.0(三): 初识MVC的Url映射潜规则Routing

ASP.NET MVC 3.0(四): 我要MVC潜规则之配置Routing

ASP.NET MVC 3.0(五): 入手Controller/Action

ASP.NET MVC 3.0(六): MVC 3.0创建你的View视图

ASP.NET MVC 3.0(七): MVC 3.0 新的Razor引擎

ASP.NET MVC 3.0(八): MVC 3.0 传递和保存你的Model

ASP.NET MVC 3.0(九): MVC 3.0 验证你的Model

ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证

ASP.NET MVC 3.0(十一): MVC 3.0 使用筛选器

ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件

ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

ASP.NET MVC 3.0(十四): MVC 3.0 实例系列之创建数据表格

ASP.NET MVC 3.0(十五): MVC 3.0 实例系列之表格的排序

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页

ASP.NET MVC 3.0(十七): MVC 3.0 实例之表格中数据的筛选

ASP.NET MVC 3.0(十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选

ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页

概述

在 ASP.NET 网站中,URL 通常映射到存储在磁盘上的文件(通常为 .aspx 文件)。 这些 .aspx 文件包括经过处理以响应请求的标记和代码。

Controller 类通常会调用一个生成 HTML 输出作为响应的单独视图组件。

默认情况下,每组组件都位于 MVC Web 应用程序项目的单独文件夹中。

回顾

MVC应用程序的执行过程

UrlRoutingModule 对象不执行任何操作,并允许请求回退到常规的 ASP.NET 或 IIS 请求处理流程。

MvcHandler 对象会选择将最终处理该请求的控制器。

它们执行下列操作:

  • 选择 MVC Web 应用程序中合适的控制器。

  • 获取特定的控制器实例。

  • 调用该控制器的 Execute 方法。

下表列出了 MVC Web 项目的执行阶段。

阶段

详细信息

接收对应用程序的第一个请求

Route 对象将添加到 RouteTable 对象中。

执行路由

Route 对象来创建 RouteData 对象,然后使用所创建的对象创建 RequestContext 对象。

创建 MVC 请求处理程序

MvcRouteHandler 对象将创建 MvcHandler 类的实例,并将 RequestContext 实例传递给处理程序。

创建控制器

MvcHandler 对象使用 RequestContext 实例标识用于创建控制器实例的 IControllerFactory 对象(通常是 DefaultControllerFactory 类的实例)。

执行控制器

MvcHandler 实例调用控制器的 Execute 方法。

调用操作

对于从 ControllerBase 类继承的控制器,与该控制器关联的 ControllerActionInvoker 对象将决定要调用的 controller 类的操作方法,然后调用该方法。

执行结果

可执行的内置结果类型包括:ViewResult(呈现视图并且是最常用的结果类型)、RedirectToRouteResult、RedirectResult、ContentResult、JsonResult、FileResult 和 EmptyResult。

基础概念

匹配定义的路由的 URL 请求。

该模块会从该路由处理程序获取一个 IHttpHandler 对象,并将该对象用作当前请求的 HTTP 处理程序。

UrlRoutingModule.RouteCollection 属性

包含路由的对象的集合。

IRouteHandler 接口

定义类必须实现才能处理匹配路由模式的请求的协定。

IRouteHandler.GetHttpHandler 方法

一个处理请求的System.Web.IHttpHandler对象。

IHttpHandler 接口

定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。

ControllerBase.Execute 方法

执行指定的请求上下文。

RouteTable 类

存储应用程序的 URL 路由。

Application_Start 事件的事件处理程序的 Routes属性中。

您添加到 Routes 属性的路由的顺序非常重要,因为应用程序会使用它在与 URL 匹配的集合中找到的第一个路由。

RouteTable.Routes 属性

获取从 RouteBase 类派生的对象的集合。

MVC 包括以下处理程序类型:

  • (它唯一的构造函数需要一个 RequestContext 对象。)

  • 然后它会将控制委托给新 MvcHandler 实例。

  • UrlRoutingModule 为所有请求启用时,通常不使用此处理程序。

Url路由

您还可以让该路由引擎自动分析 URL 中定义的变量,并让 ASP.NET MVC 框架将值作为参数自变量传递给控制器。

路由

若要定义路由,可以通过指定 URL 模式、处理程序和(可选)路由名称,创建 Route 类的一个实例。

Routes 属性是一个存储应用程序的所有路由的 RouteCollection 对象。

MvcApplication 类中定义的,该类是在 Global.asax 文件中定义的。

特性

由于该 URL 不必映射到文件,因此可以使用对用户操作进行描述因而更易于被用户理解的 URL。

id=4 来确定要显示的内容类型。

另外,可以在 URL 模式中包含占位符,以便无需查询字符串,即可将变量数据传递到请求处理程序。

/Products/show/beverages 片断将被解释为应用程序中一个文件的路径。

URL 模式

文本和占位符位于由斜杠 (/) 字符分隔的 URL 段中。

对于路由,键是在 URL 模式中定义的占位符名称,只有值位于 URL 中。

country 占位符的值分隔开。

下表演示有效的路由模式和一些与模式匹配的 URL 请求的示例。

路由定义

匹配 URL 示例

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

{locale}/{action}

/US/show

{language}-{country}/{action}

/en-US/show

MVC 应用程序中的典型 URL 模式

{action} 占位符。

URL 中的操作值确定要调用的操作方法。

Show 方法。

下表显示了默认 URL 模式,并给出由默认路由处理的 URL 请求的示例。

默认 URL 模式

匹配 URL 示例

{controller}/{action}/{id}

http://server/application/Products/show/beverages

{resource}.axd/{*pathInfo}

http://server/application/WebResource.axd?d=...

{resource}.axd/{*pathInfo} 的路由,以避免对 Web 资源文件(例如 WebResource.axd 或 ScriptResource.axd)的请求传递给控制器。

对于 IIS 6.0,必须向 URL 模式添加 .mvc 文件扩展名,如下面的示例所示:

{controller}.mvc/{action}/{id}

Global.asax默认路由

publicstaticvoid RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller ="Home", action ="Index", id = UrlParameter.Optional } // 参数默认值
);
}
protectedvoid Application_Start()
{
//在程序启动的时候注册我们前面定义的Route规则
RegisterRoutes(RouteTable.Routes);
}

总结

我们从MVC程序的运行开始一步一步,深入了解了MVC程序使用其强大的Routing规则,使我们使用和开发MVC程序都有了新的体验和认识。从而在一定基础上保护了程序的健壮性。

下节预告

继续学习并创建自己的潜规则Routing。。。。

声明:本文部分内容来自于网络。版权归原作者所有。

转:记忆逝去的青春 http://www.cnblogs.com/lukun/