1、概述:
URL路由(URL Routing),指的是在基于ASP.NET 3.5 MVC的网站中,URL不再是文件目录中的一个文件,而是一个说明有关URL路由的字符串,开发者可以自行定义该字符串的格式,方便使用者理解相关页面的功能。
在URL路由中,首先需要定义URL路由,该URL路由通过占位符定义URL的模式,URL路由将用户请求的URL路由解析为一系列的离散值。例如:对于一个URL请求http://server/application/products/show来说,URL路由将解析后的离散值products,show值发送到相关的处理程序,而对于传统的ASP.NET应用程序来说,/products/show部分只不过是一个文件的部分路径而已。
URL路由是与ASP.NET 3.5 MVC框架独立的一个功能,也就是说,开发者可以在传统的ASP.NET应用程序中使用URL路由。(system.web.routing)
2、定义URL路由(设置URL模式):
在URL路由中,通过大括号{}定义占位符,这些占位符就是URL路由参数,而字符串中的“/”、"."等符号则作为分隔符为URL路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。
有效的URL路由定义 | 匹配的URL例子 |
{controler}/{Action}/{id} | /Products/show/beverages |
{table}/Details.aspx | /Products/Details.aspx |
blog/{Action}/{entry} | /blog/show/123 |
{reportype}/{year}/{month}/{day} | /sales/2008/1/5 |
第1行定义了含有3个URL路由参数的URL路由,此时Products就是控制器的名称,show就是该控制器中所定义的一个方法,而beverages则是一个id变量;
第2行定义中,products是一个数据表名称,而details.aspx则是一个常量;
第3行定义了含有2个URL路由参数的URL路由,此时blog是一个常量,show是相关控制器中所定义的一个方法,而123则是一个entry变量;
第4行定义个含有4个URL路由参数的URL路由,此时sales是一个reportype变量,2008是一个year变量,1是一个month变量,5则是一个day变量。
在程序中,开发者一般通过Grobal.asax文件,在Application_Start()方法中设置上述URL路由的定义。
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{Action}/{categoryName}",
new CategoryRouteHandler()
);
}
3、设定URL路由参数的默认值
{ protected void Application_Start(object sender, EventArgs e)
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{Action}/{categoryName}",
new CategoryRouteHandler()
)
{
Defaults=new RouteValueDictionary
{{"categoryName","food"},{"Action","show"}}
}
}
在上述代码中,创建了所定义URL路由参数的默认值,即categryName变量的默认值为food,而Action方法则是对应控制器中的show()方法。
URL | 参数值 |
/Category | Action="show",categoryName="food" |
/Category/add | Action="add",categoryName="food" |
/Category/add/beverages | Action="add",categoryName="beverages" |
第1行中被请求的URL中没有包含任何URL路由参数,因此URL路由将使用设定的默认值,此时categoryName变量的默认值是food,而Action方法则是对应控制器中的show()方法;
第2行中北请求的URL中包含一个URL路由参数,因此URL路由解析该URL后,此时categoryName变量的默认是food,而Action方法则是对应控制器中的Add()方法;
第3行中被请求的URL中包含完整的URL路由参数,因此URL路由解析该URL后,此时categoryName变量的默认值是beverages,而Action方法则是对应控制器中的Add()方法。
4、MVC 中URL的使用
在通过ASP.NET MVC项目模板建立的一个基本MVC网站中,在Global.asax文件中就已经设定好了默认的URL路由,以便开发者即刻运行所建立的MVC网站。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
5、URL路由的映射
当一个URL被请求时,ASP.NET MVC框架首先使用UrlRoutingModule模块来解析该URL地址,然后通过MvcHandler对象,选择相关的控制器及控制器中的相关方法来处理用户的请求。