我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL。
ASP.NET MVC会依次根据如下三个规则生成URL:
-
调用ASP.NET MVC API函数时传入的参数信息
-
当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值
-
系统定义路由中路由参数的默认值
下面这篇文章通过一个例子来阐述ASP.NET MVC是怎么通过上面三点来生成URL。
首先我们在MVC系统中定义了如下两个路由
public class RouteConfig{ public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Lang", url: "Culture/{lang}/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = 123 } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }}
运行ASP.NET MVC项目时,如果我们在浏览器地址栏上输入地址http://localhost/culture/en-us/Home/Index,那么这个地址会匹配上面第一个路由Lang(因为ASP.NET MVC的路由表是从上往下匹配的,如果某个路由匹配成功就不会再往下匹配了)。
如果我们现在在http://localhost/culture/en-us/Home/Index这个地址运行的View上(也就是HomeController下的Index这个View),调用Url.Action生成URL:
Index @Url.Action("DoSomething")
那么我们来看看调用API时,ASP.NET MVC生成URL的步骤:
1.由于在调用API Url.Action时传入了参数DoSomething,所以路由中可以得到参数Action为DoSomething。
Action:DoSomething
2.当前请求的URL是http://localhost/culture/en-us/Home/Index,那么用这个地址从上往下去匹配系统定义的路由,匹配到第一个路由Lang时我们可以得到两个参数信息,Controller为Home,lang为en-us,那么现在我们得到的路由信息有:
Controller:HomeController
Action:DoSomething
lang:en-us
3.由于路由Lang中,我们定义了参数id有默认值123,所以最后我们得到的路由信息如下:
Controller:HomeController
Action:DoSomething
lang:en-us
id:123
现在根据最后得到的路由信息再去从上到下匹配系统定义的路由,那么首先匹配到路由Lang时,MVC发现Lang中每个路由参数现在都有值了,匹配成功,所以根据Lang生成的URL就如下图所示(注意:参数id由于是路由Lang中定义的默认值,所以最后没有在生成的URL中体现出来)