随笔-121  评论-1531  文章-1  trackbacks-99

ASP.NET MVC URL Routing 学习

定义URL Routing

在一个route中,通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候,符号"/""."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大括号中的信息则作为常量值。
下面是一些示例URL

Valid route definitions

Examples of matching URL

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

 通常,我们在Global.asax文件中的Application_Start事件中添加routes,这确保routes在程序启动的时候就可用,而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它,注册该routes的方法必需是静态的同时有一个RouteCollection参数。
下面的示例是Global.asax中的代码,演示了添加一个包含两个URL参数action categoryName的Route对象:

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


设置Route参数的默认值
当你定义个一route的时候,你可以分配一个默认值给route的参数。默认值是当URL中没有包含参数的值的时候使用的。你可以在Route类中通过dictionary来设置Default属性来设置route的默认值:

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 Routing处理URL Request的时候,上面route定义产生的结果如下表所示:  

URL

Parameter values

/Category

action = "show"
categoryName = "food"

/Category/add

action = "add"
categoryName = "food"

/Category/add/beverages

action = "add"
categoryName= "beverages"

 
处理不确定个数的参数
有时候你需要处理一个URL包含的参数是不确定的URL请求。在你定义route的时候,你可以设置最后一个参数包含一个星号,使最后一个参数匹配URL中剩下的参数。例如:

query/{queryname}/{*queryvalues}

当URL Routing处理URL Request的时候,上面route定义产生的结果如下表所示:

URL

queryvalues parameter

/query/select/bikes/onsale

"bikes/onsale"

/query/select/bikes

"bikes"

/query/select

Empty string

 
在匹配URL的时候添加约束
通过添加约束使URL参数在我们的程序中能更好的工作。废话不多说了,直接看代码:

void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}
 

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add(
new Route
    (
     
"{locale}/{year}"
         ,
new ReportRouteHandler()
    )
      
{
          Constraints
= new RouteValueDictionary
         
{{"locale", "{a-z}{2}-{A-Z}{2}"},{year, @"\d{4}"}}
       }
);
}
 

当URL Routing处理URL Request的时候,上面route定义产生的结果如下表所示:

URL

Result

/en-US

No match. Both locale and year are required.

/en-us/2008

No match. The constraint on locale requires the fourth and fifth characters to be uppercase.

/en-US/08

No match. The constraint on year requires 4 digits.

/en-US/2008

locale = "en-US"

year = "2008"


从Routes中创建URL
当你想集中控制逻辑来构造URL时,你可以使用routes来产生URLs。通过传递一个dictionary的参数值给RouteCollection对象的GetVirtualPath方法来创建一个URL。GetVirtualPath方法查找RouteCollection对象中第一个route中跟dictionary匹配的参数,匹配的route被用来产生URL。还是看下面的示例:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.Add(
new Route
  (
    
"Category/{action}/{categoryName}"
         
new CategoryRouteHandler()
  )
   
{
       Defaults
= new RouteValueDictionary {{"categoryName", "food"},
          
{"action", "show"}}

     }

  );
}
 

下面的示例演示了基于上面的route创建的URL

HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath
  (context,
 
new RouteValueDictionary {
    {
"categoryName", "beverages" },
    {
"action", "summarize" }}
  ).VirtualPath;

当代码运行的时候,HyperLink1控件将会包含值"Category/summarize/beverages"在NavigateUrl属性中。

注:以上参考自 http://quickstarts.asp.net/3-5-extensions/mvc/URLRouting.aspx

作者:QLeelulu Follow QLeelulu on Twitter
出处:http://QLeelulu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
标签: MVC, URL Routing,
posted on 2008-03-17 19:35 Q.Lee.lulu 阅读(7434) 评论(9) 编辑 收藏

评论:
#1楼 2008-03-18 10:49 | SZW      
既然说到MVC2了,怎么没看到通配符呢?

补充=====
又仔细看了下,还是提到了:)

支持楼主!

 回复 引用 查看   
#2楼 2008-03-18 11:20 | ithurricane      
写的不错,学习了

 回复 引用 查看   
#3楼 2008-05-16 01:53 | 镜涛      
学习
 回复 引用 查看   
#4楼 2009-02-27 17:34 | wanghonghu[未注册用户]
不错哈!努力把这系列学完!谢谢楼主了
 回复 引用   
#5楼 2009-03-25 09:57 | GLong[未注册用户]
我在Views的Shared文件下建了个Library的文件夹,里面放一些通用的用户控件,但是不知怎么引用他,请楼主指教.
 回复 引用   
#6楼[楼主] 2009-03-25 18:08 | Q.Lee.lulu      
@GLong
return view("Library/test.ascx");
这样试试看

 回复 引用 查看   
#7楼 2009-09-03 09:40 | 狼狼      
请楼主指教,views下有多级目录时,路由规则如何配置?
目前,mvc默认的路由规则只能实现单级目录。
目录比如:views/UserManage/UserInfo/index.aspx
这样的结构需求便于业务开发和理解。

 回复 引用 查看   
#8楼[楼主] 2009-09-03 22:44 | Q.Lee.lulu      
你需要重写view的搜索规则,参考:http://www.cnblogs.com/QLeelulu/archive/2008/07/21/1248183.html,这篇文章和ASP.NET MVC 1.0版的接口有些出入,你可以搜索下相关的文章
 回复 引用 查看   
#9楼 2011-04-07 14:29 | srykdm[未注册用户]
Constraints = new RouteValueDictionary{
{"locale", "{a-z}{2}-{A-Z}{2}"},{year, @"\d{4}"}}
}
中正则表达式应该为"[a-z]{2}-[A-Z]{2}"

 回复 引用   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1109893 X1cg5DVoOK0=
昵称: lulu
网名: QLeelulu
大学: GDUT
城市: 广州=>珠海
职业: 打字员
CO. : PowerEasy => KingSoft
Mail: QLeelulu@163(gmail).com

Who Am I ?


Follow QLeelulu on Twitter
交流群 ASP.NET MVC交流群:
QQ群:1215279(满)
2群:1214648(满)
3群:47788243
(加的时候请注明)



昵称:Q.Lee.lulu
园龄:4年3个月
荣誉:推荐博客
粉丝:318
关注:7
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

搜索

 

常用链接

我的标签

随笔分类

随笔档案

.NET 资源

PowerEasy

我的好友

积分与排名

  • 积分 - 734316
  • 排名 - 65

最新评论

阅读排行榜

评论排行榜

推荐排行榜