ASP.NET MVC 3.0,四: 我要MVC潜规则之配置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 实例之使用开源控件实现表格排序和分页

概述

通过添加Routing规则,使URL能够安装指定的规则发送HTTP请求,这种方式能够简洁、方便、有效、快速的实现对指定页面的访问或者参数的传递,更易于被用户理解该URL

MVC Routing之优

在不使用路由的 ASP.NET 应用程序中,对 URL 的传入请求通常映射到处理该请求的物理文件,如 .aspx 文件。 id=4 来确定要显示的内容类型。

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

在不由 URL 路由管理的请求中,/Products/show/beverages 片断将被解释为应用程序中一个文件的路径。

关于Routing的详细介绍请移步

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

URL 如何与路由匹配

将 URL 请求与路由匹配取决于以下所有条件:

  • 包括在项目类型中的已经定义的路由模式或默认路由模式(如果有的话)。

  • 将路由添加到 Routes 集合中的顺序。

  • 已经提供给路由的所有默认值。

  • 已经提供给路由的任意约束。

  • 是否定义路由来处理匹配物理文件的请求。

通常,按从路由定义的具体性递减的顺序将路由添加到 Routes 属性。

实例说明

假定您使用以下模式添加路由:

  • {controller}/{action}/{id}

  • products/show/{id}

http://server/application/products/show/bikes 的请求似乎能更好地匹配路由 2,但它是由路由 1 使用下列值处理的:

  • products。

  • show。

  • bikes。

例如,假定您使用以下模式添加路由:

  • month 使用默认值。

  • year 使用默认值。

但是,路由 1 中的默认值意味着将匹配同时适用于路由 2 的所有请求。

monthly/{report}/{year}/{month} 的常量来避免二义性。

相反,会将处理传递给 ASP.NET 页、Web 服务或其他 ASP.NET 终结点。

向MVC程序中添加路由

预先配置了默认的路由规则,该规则将调用您在Controller类中实现的操作方法。

如果您想要在 MVC 应用程序中添加自定义路由,则要使用 MapRoute(RouteCollection, String, String) 方法,不要使用 MapPageRoute(String, String, String) 方法。

对映射路由的引用

RouteCollection.MapPageRoute 方法 (String, String, String)

路由的名称,

路由的 URL 模式)

它等效于调用 Add 方法,然后传递使用 PageRouteHandler 类创建的 Route 对象。

下面的示例演示在 Global.asax 文件(该文件是在 MVC 应用程序的 Visual Studio 项目模板中定义的)中创建默认 MVC 路由的代码。

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);
}
}

设置URL参数默认值

下面的示例演示如何使用 MapPageRoute(String, String, String, Boolean, RouteValueDictionary) 方法添加具有默认值的路由。

如下:MVC 应用程序的 Visual Studio 项目模板中默认 MVC 路由的代码

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);
}
}

RouteCollection.MapPageRoute 方法 (String, String, String, Boolean, RouteValueDictionary)

路由参数的默认值)

返回类型为System.Web.Routing.Route将添加到路由集合的路由

自定义默认路由

如下代码:

publicstaticvoid RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("",
"Category/{action}/{categoryName}",
"~/categoriespage.aspx",
true,
new RouteValueDictionary {{"categoryName", "food"}, {"action", "show"}});
}

show 的默认值)得到下表列出的结果。

URL

参数值

/Category

/Category/add

/Category/add/beverages

对于 MVC 应用程序,通过 RouteCollectionExtensions.MapRoute 方法的重载(例如 MapRoute(RouteCollection, String, String, Object, Object))可以指定默认值。

在 URL 模式中处理可变数量的段

下面的示例演示一个与未知数量的段匹配的路由模式。

query/{queryname}/{*queryvalues}

ASP.NET 路由处理 URL 请求时,在示例中演示的路由定义得到下表列出的结果。

URL

参数值

/query/select/bikes/onsale

/query/select/bikes

/query/select

queryvalues = Empty string

添加路由约束

添加约束以确保 URL 参数包含将在应用程序中起作用的值。

字典中的值可以是表示正则表达式的字符串,也可以是实现 IRouteConstraint 接口的对象。

总是将正则表达式视为不区分大小写。

Match 方法返回一个布尔值,该值指示参数值是否有效。

通过使用正则表达式可以规定参数格式,比如controller参数只能为4位数字:

new { controller =@"\d{4}"}

通过第IRouteConstraint 接口目前可以限制请求的类型.因为System.Web.Routing中提供了HttpMethodConstraint类, 这个类实现了IRouteConstraint 接口. 我们可以通过为RouteValueDictionary字典对象添加键为"httpMethod", 值为一个HttpMethodConstraint对象来为路由规则添加HTTP 谓词的限制, 比如限制一条路由规则只能处理GET请求:

httpMethod =new HttpMethodConstraint(  "GET", "POST"  )

完整的代码如下:

            routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的URL
new { controller ="Home", action ="Index", id ="" }, //参数默认值
new { controller =@"\d{4}" , httpMethod =new HttpMethodConstraint( "GET", "POST" ) }
);

当然我们也可以在外部先创建一个RouteValueDictionary对象在作为MapRoute的参数传入, 这只是语法问题.

(在 MVC 应用程序中,使用 MapRoute 方法。)

publicstaticvoid RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("",
"Category/{action}/{categoryName}",
"~/categoriespage.aspx",
true,
new RouteValueDictionary {{"categoryName", "food"}, {"action", "show"}},
new RouteValueDictionary {{"locale", "[a-z]{2}-[a-z]{2}"}, {"year", @"\d{4}"}}
);
}

路由处理 URL 请求时,在上一示例中演示的路由定义生成下表列出的结果。

URL

结果

/US

year 都是必需的。

/US/08

year 的约束需要 4 个数字。

/US/2008

实例:下面是自定义的一些路由规则

publicstaticvoid RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// URL匹配
// Details/list/CQ/100,200-3
routes.MapRoute(
"Details",
"Details/{action}/{city}/{price}-{star}",
new {controller ="Details", action ="list", city ="CQ", price ="-1,-1", star ="-1"},
new {city =@"[a-zA-Z]*", price =@"(\d)+\,(\d)+", star ="[-1-5]"}
);
// URL匹配
// Details/所有匹配
routes.MapRoute(
"Details",
"Details/{*values}",
new { controller ="Details", action ="default", id ="" }
);
// URL匹配
// Home/.
routes.MapRoute(
"Home",
"{*values}",
new { controller ="Home", action ="index" }
);
}

没有路由怎么办?

本节介绍路由不处理请求的一些情况。

找到匹配 URL 模式的物理文件

{controller}/{action}/{id}),路由也不处理该请求。

true 后,与定义的模式匹配的所有请求都将由路由处理。

为 URL 模式显式禁用路由

下面的示例演示如何阻止路由处理 WebResource.axd 文件的请求。

//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

总结

废话就不多说了。。。

下节预告

入手Controller与Action。。。。

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