[读书笔记]ASP.NET的URL路由引擎
作用
一般的URL:
举例:http://www.myapp.com/app.aspx?id=2&sessionid=29320xafafa02fa0zga0g8a0z
缺点:
- 不美观,不清晰
- 搜索引擎不友好,爬虫无法知道文件名后的更多地产品分类
因此,需要把它映射成更简单易用、涵盖信息更广的URL。
路由映射基础
相关类:RouteCollection
命名空间:System.Web.Routing
方法:RouteCollection.MapPageRoute(),实例方法
基本思路:要使用URL路由引擎,首先注册路线图。路线图只是从路径表达式到磁盘上的实际页面的一个映射。这些路径在应用程序启动时注册,注册操作通常包含在单独的方法中,如下面代码所示,代码段来自Global.asax.cs文件:
1 void Application_Start(object sender,EventArgs e) 2 { 3 //Code that runs on application startup 4 InitializeRoutes(RouteTable.Routes); 5 } 6 private void InitializeRoutes(RouteCollection routes) 7 { 8 //...perform route registration 9 routes.MapPageRoute(...); 10 }
注:routes为RouteCollection的实例
下面总结URL路由的用法,基本上就是RouteCollection.MapPageRoute()的各种重载方法。
1.映射基础URL
1 routes.MapPageRoute("login","login","~/Login.aspx);
2.映射包含参数的URL
1 routes.MapPageRoute("blog","blog/{year}/{month}/{day}","~/Blog.aspx");
参数的查询不能通过Request.queryString来获取,因为参数并不是查询字符串的一部分,参数存在RouteData字典中。正确代码如下:
1 protected void Page_Load(object sender,EventArgs e) 2 { 3 string year=RouteData.Values["year"] as string; 4 string month=RouteData.Values["month"] as string; 5 string day=RouteData.Values["day"] as string; 6 //Perform blog processing based on date parameters 7 }
3.映射包含多个段的URL
将一个星号(“*”)置于命名参数之前:
1 routes.MapPageRoute("products-by-tag","products/tags/{*tagnames}","~/ProductsByTag.aspx");
其中,tagnames中的各字段用单斜线(“/“)分割。
4.使用包含默认参数的路由
1 routes.MapPageRoute("category-browse","category/{categoryname}","~/Category.aspx",true, 2 new RouteValueDictionary() 3 { 4 {"categoryname","explosives"} 5 });
注意的是,目标页面无需知道是否使用的时默认值,仅需从RouteData字典中捕获类别名称即可。
5.使用约束路由
这些约束采用正则表达式进行。
1 routes.MapPageRoute( 2 routeName:"constrained-blog", 3 routeUrl:"cblog/{year}/{month}/{day}", 4 physicalFile:"~/Blog.aspx", 5 checkPhysicalUrlAccess:True, 6 defaults: new RouteValueDictionary({{"year",DateTime.Now.Year.ToString()},...}, 7 constraints:new RouteValueDictionary() { 8 {"year",@"\d{0,4}"}, 9 {"month",@"\d{0,2}"}, 10 {"day",@"\d{0,1}" } 11 } 12 );
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。