当URL路由处理一个URL请求时,上面例子中定义的路由将产生如下列表格所示的结果。
|
URL
|
结果
|
|
/en-US
|
不匹配,要求locale和year are required.
|
|
/en-us/2008
|
不匹配,对于locale的约束要求第4和第5个字符为大写
|
|
/en-US/08
|
不匹配,对于year的约束要求使用4位数方式
|
|
/en-US/2008
|
locale = "en-US"
year = "2008"
|
七、 使用路由创建URL
当你想把构造URL的逻辑集中到一起时,你可以选择使用路由来生成URL。你可以把参数值作为一个字典传递到RouteCollection对象的GetVirtualPath方法中来创建一个URL。GetVirtualPath方法将在RouteCollection对象中查找匹配字典中参数的第一个路由,然后使用匹配的路由来生成相应的URL。
下面给出了一个路由的定义:
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
new CategoryRouteHandler()
)
{
Defaults = new RouteValueDictionary {{"categoryName", "food"},
{"action", "show"}}
}
);
}
下列示例则展示了一个基于路由创建一个URL的控件:
HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath _
(context, _
New RouteValueDictionary(New With {.categoryName = "beverages", _
.action = "summarize"})).VirtualPath
HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath
(context,
new RouteValueDictionary {
{ "categoryName", "beverages" },
{"action", "summarize" }}
).VirtualPath;
当运行这段代码时,HyperLink1控件的NavigateUrl属性中将包含“Category/summarize/beverages”。
八、 映射URL到控制器及行为
一个URL请求首先要路由到对象UrlRoutingModule,然后到达HTTP处理器MvcHandler,最后由这个HTTP处理器MvcHandler决定调用哪一个控制器以及具体调用哪一个行为方法。
MVC框架会接收controller参数中的值,然后添加上后缀“Controller”以决定所请求的控制器的名字。例如,一个包括URL路径/Products的URL要被映射到一个名字为ProductsController的控制器。action参数中的值正好对应于要调用的行为方法的名字。而一个包括URL路径/Products/show的URL将导致对于ProductsController类的show方法的调用。
根据ASP.NET MVC框架约定,一个控制器类必须实现System.Web.MVC.IController接口,并且控制器的命名必须以“Controller”结尾。实现一个控制器最容易的方法是从基类System.Web.MVC.Controller派生一个子类。然后,你可以在该控制器类中添加有ControllerAction属性标记的方法并使用默认的URL路由处理程序来调用这些方法。如果你使用这种方案,那么你可以依赖于MVC框架去执行URL路由并暴露标记有ControllerAction属性的行为。
九、 小结
在ASP.NET MVC框架中,它使用URL路由技术实现把URL映射到控制器类及相应行为中。尽管URL路由技术并不太难理解,但是熟练并全面掌握URL路由技术相关概念及注意事项是使用微软新式ASP.NET MVC框架进行ASP.NET开发的基础与前提。