原文:http://quickstarts.asp.net/3-5-extensions/mvc/mvcurlrouting.aspx
简介
在ASP.NET应用程式,引入的URL请求一般都会直接映射到.aspx文件。一个不使用URL重写的标准ASP.NET应用程式,一个“ /InterestingNews.aspx”的请求将会映射到物理文件“InterestingNews.aspx”,其包含的代码和标记就会输出浏览器相应的响应。
ASP.NET MVC框架包括一个URL导航引擎,它可以映射引入的请求到控制器的类和动作(动作部分通常是需要的,但并不是必要,它协作于控制器类的方法)。URL导航引擎可以分析你在URL所定义的变量,自动以方法参数的形式传入控制器的动作。
ASP.NET MVC 模板在Global.asax文件的Application类包含了一个预先配置好的URL导航规则。这默认的配置能让你无需为你的程序显示配置导航规则就可以开始编写ASP.NET MVC 应用程式。换句话说,你可以使用默认的命名URL映射协定。
默认的命名URL映射协定
默认的命名协定映射引入的HTTP请求的URL路径的一部分到对应的控制器。映射是基于URL对应的控制器名为“UrlPathController”。举例,一个URL包含路径“/Products/”映射的控制器名为“ProductsController”。
控制器类必须实现System.Web.MVC.IController接口,且名称必须以“Controller”结尾。最简单实现控制器的方法就是创建一个继承于System.Web.MVC.Controller的类。你可以向控制器添加方法,方法要标记上ControllerAction特性,让默认的URL导航处理器能调用到对应的方法。如果你遵循这些规则,你就能让MVC框架运行URL导航,以及选择公开你标记了特性的行为方法。
当控制器和导航规则被定义后,ASP.NET MVC框架执行控制器的类,去处理全部以控制器类名称开头的URL请求。如“/Products/”URL。默认的,一个向服务器的请求大致类似以下这种形式:
http://site/application/controller/action[parameters]note
这里所描述的URL导航是为新的ASP.NET MVC应用程式提供的一种默认的模式。当然,你也可以使用不同的模式,创建自定义的URL导航。
如果需要的话,控制器可以调用基于控制器URL的其他部分,如/Products/Categories, /Products/List/Beverages, 和/Products/Detail/3。
请求导航是通过UrlRoutingModule和MvcHandler的HTTP处理实现的。MvcHandler决定哪个控制器被调用。URL的行为部分表示控制器哪个方法被呼叫。行为与业务逻辑合并执行模型的交互。这些行为的结果会被指定的视图所呈现。
URL到控制器的映射
ASP.NET MVC框架使用的默认规则映射控制器和URL,规则包括、行为的名称以及任何行为的参数。以下例子演示URL的语法:
http://domain/site/controller-name/action-method-name?parameters
http://domain/site/controller-name.mvc/action-method-name?parameters
注意:
在IIS6.0中,.mvc扩展名是必需的。
下面的例子展示一个具体的URL到控制器的映射:
http://www.contoso.com/Shopping/Store/ShowCategory?id=5
一些开发者喜欢更加易读的URL语法,如下所示:
http://www.contoso.com/Shopping/Store/beverages/
ASP.NET MVC 框架允许你定义不同的映射设计和自定义URL语法。你可以为你的程式做一个映射设计,定义更有意义的URL,令他支持不同的搜索引擎模型。
举例,在默认的URL映射的情况,下面的URL应该执行ShowCategory方法且附带的参数为5,然后获取Northwind数据库显示Beverages目录。
http://www.contoso.com/Shopping/Store/ShowCategory?id=5
一个自定义的架构可以使用以下URL定制语法,提供相同的数据呈现:
http://www.contoso.com/Shopping/Store/products/beverages
定义RouteTable, Routes, 和 RouteData
你可以在Global.asax文件的Application_Start时间内定义URL导航的映射。下面的例子演示了一般Global.asax文件包括添加到RouteTable对象的Route对象实例。
public class Global : System.Web.HttpApplication {
protected void Application_Start(object sender, EventArgs e) {
RouteTable.Routes.Add(new Route {
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
}
}
RouteTable公开Routes collection,包含Route对象集合。每次MvcModule的请求都会执行RouteTable。MvcModule 对象查询每一个在集合中的Route对象,查看URL是否有符合Route对象的映射。
注意
映射的逻辑定义在MvcModule,并且不可自定义。
当URL找到相应的Route映射时,Route就会产生一个IRouteHandler实例。IRouteHandler 实例定义了Route的HTTP Handler。这个Route 处理为请求创建了IHttpHandler 。IRouteHandler 的执行方法被呼叫,并设置到当前的上下文。
如果没有导航相对应,RouteTable 中没有定义相应的Route 。相应处理就直接指向ASP.NET page, Web service, 或其他ASP.NET 终端。
Route 在Routes 集合中的排序是有意义的。Route 对应搜索是从第一个到最后一个的顺序查询。当对应的Route 找到之后,搜索就会停止。默认的route一般放在最后面。
对于IIS7.0,不需要后缀名。下面的代码例子展示创建一个没有后缀名的URL控制器映射的RouteTable 集合。
RouteTable.Add(new Route("/[controller]/[action]/[id]",
new { action = "Index", id = (string)null },
typeof(MvcRouteHandler));
对于IIS 6.0,URL的名称必须包含mvc的后缀名。下面的代码例子展示创建有后缀名的URL控制器映射的RouteTable 集合。
RouteTable.Add(new Route("/[controller].mvc/[action]/[id]",
new { action = "Index", id = (string)null },
typeof(MvcRouteHandler));
基于前文所提的URL,以下与其对应RouteData所通讯的值。
URL
|
RouteData object values
|
/domain/site/blog
|
Controller="blog", action="Index", id=null
|
/domain/site/blog/ShowPosts
|
Controller="blog", action="ShowPosts", id=null
|
/domain/site/blog/ShowPosts/123
|
Controller="blog", action="ShowPosts", id="123"
|
当route找到对应时,UrlRoutingModule产生以“键-值”成对地产生以上数据RouteData实例。。
如果引入的URL没有route对应,相应处理就直接指向ASP.NET page, Web service, 或其他ASP.NET 终端。