System.Web.Routing入门及进阶 下篇

简介: System.Web.Routing入门及进阶 上篇 上面介绍的是最简单的一种定义方式。当然我们可以建立更复杂的规则。其中就包括设定规则的默认值以及设定规则的正则表达式。 UrlRouting高级应用 预计效果: 当我访问/a/b.

 

System.Web.Routing入门及进阶 上篇

上面介绍的是最简单的一种定义方式。当然我们可以建立更复杂的规则。其中就包括设定规则的默认值以及设定规则的正则表达式。

UrlRouting高级应用

预计效果:

当我访问/a/b.aspx时就会转到Default.aspx?category = a&action = b在页面上显示
category:a
action:b

亦如果我访问/chsword/xxxx.aspx就会转到Default.aspx?category
= chsword&action = xxxx就会显示
category:chsword

action:xxxx

 

如果访问/chsword/就会转到 Default.aspx?category=chsword&action=index就会显示

 category:chsword

action:index

 

 首先我建立一个Route

routes.Add(
                
" Default " ,
                
new  Route( " {category}/{action}.aspx " ,
                          
new  RouteValueDictionary(
                              
new
                                  {
                                      file 
=   " Default " ,
                                      category 
=   " home " ,
                                      action 
=   " index "
                                  }), 
new  MyRouteHandler()
                    )
                );

当然IHttpHandler的处理方式也要有所改变

为了方便查看我使用了下方法:

 

    context.Server.Execute( string .Format( " /{0}.aspx?category={1}&action={2} " ,
              RequestContext.RouteData.Values.ContainsKey(
" file " )
                
?  RequestContext.RouteData.Values[ " file " ].ToString()
                : 
" default " ,
              RequestContext.RouteData.Values.ContainsKey(
" category " )
                
?  RequestContext.RouteData.Values[ " category " ].ToString()
                : 
"" ,
              RequestContext.RouteData.Values.ContainsKey(
" action " )
                
?  RequestContext.RouteData.Values[ " action " ].ToString()
                : 
"" )
                );

 

即/a/b.aspx是映射到Default.aspx?category=a&action=b

在Default.aspx中写如下代码:

 category: <% = Request.Params[ " category " %> < br  />
   action:
<% = Request.Params[ " action " %>

 

以显示传入的参数。

如果在IIS中设置Index.aspx时就算输入/a/也会访问到/a/index.aspx,即默认的会按RouteValueDictionary中设置的值自动补全

UrlRouting使用正则表达式规则

UrlRouting在定义的时候也可以按正则的规则来进行定义。

 

 

            routes.Add(
                
" zz " ,
                
new  Route( " {category}/{action}.chs " ,
                    
new  RouteValueDictionary(
                        
new  {
                            file 
=   " Default " ,
                            category 
=   " home " ,
                            action 
=   " 1 "
                        }),
                        
new  RouteValueDictionary(
                        
new  {
                            action 
=   " [\\d]+ "
                        }),
                    
new  MyRouteHandler()
                    )
            );

 

以上代码规定了action只能是数字则访问/a/1.chs可以正常访问。

而访问/a/b.chs则会显示未找到资源。

 

当然这是里可以使用更高级的正则表达式。

UrlRouting的技巧

排除UrlRouting的方法:

System.Web.Routing默认提供了一个IRouteHandlerStopRoutingHandler Class,经过它处理的URL不会被做任何处理

通常使用方法如下:

routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));

 

RouteHandler工厂:

其实IRouteHandler可以实现一个RouteHandler的简单工厂。

     public   class  RouteHandlerFactory : IRouteHandler
    {
        
string  Name {  get set ; }
        
public  RouteHandlerFactory( string  name){ this .Name  =  name;}
        
#region  IRouteHandler 成员
        
public  IHttpHandler GetHttpHandler(RequestContext requestContext) {
            
if  ( this .Name  ==   " mypage " )
                
return   new  MyPage(requestContext);
            
if ( this .Name = " mypage1 " )
                
return   new  MyPage1(requestContext);
        }
        
#endregion
    }

 

 规定HTTP verbs,这里要使用System.Web.Routing中的HttpMethodConstraint

 

void  Application_Start( object  sender, EventArgs e) {
    RegisterRoutes(RouteTable.Routes);
}
public   static   void  RegisterRoutes(RouteCollection routes){
    
string [] allowedMethods  =  {  " GET " " POST "  };
    HttpMethodConstraint methodConstraints 
=   new  HttpMethodConstraint(allowedMethods);
    Route reportRoute 
=   new  Route( " {locale}/{year} " new  ReportRouteHandler());
    reportRoute.Constraints 
=   new  RouteValueDictionary { {  " httpMethod " , methodConstraints } };
    routes.Add(reportRoute);
}

 

Demo程序代码下载:

 http://files.cnblogs.com/chsword/WebApplication3.rar

 

 

 

 

目录
相关文章
|
21天前
jetty内嵌web页面服务入门
jetty内嵌web页面服务入门
16 1
|
8天前
|
前端开发 数据库 Python
Django入门全攻略:从零搭建你的第一个Web项目
Django入门全攻略:从零搭建你的第一个Web项目
|
1月前
|
JSON 前端开发 Java
Spring Web MVC入门(3)——响应
Spring Web MVC入门(3)——响应
28 1
|
1月前
|
关系型数据库 应用服务中间件 数据库
编程入门(一)【Web服务器环境的部署】
编程入门(一)【Web服务器环境的部署】
47 1
|
15天前
|
监控 小程序 前端开发
基础入门-抓包技术&HTTPS协议&WEB&封包监听&网卡模式&APP&小程序
基础入门-抓包技术&HTTPS协议&WEB&封包监听&网卡模式&APP&小程序
|
15天前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
2月前
|
前端开发 JavaScript Java
JAVA Web开发入门与实战
本文引导读者入门JAVA Web开发,介绍了Web开发的基本概念,如Servlet、JSP和JavaBean,并详细阐述了JAVA Web开发环境的搭建。文章通过一个在线书店系统的实战项目,展示了从需求分析、数据库设计到前后端开发的全过程,涵盖Servlet处理请求、JSP动态生成页面及表单添加书籍功能。最后,文章提及了进阶技术,如框架使用、前端集成和安全性考虑,鼓励读者深入探索JAVA Web开发的广阔世界。
|
2月前
|
数据库连接 Python
Flask 框架入门与实践:构建你的第一个 Web 应用
【5月更文挑战第18天】本文介绍了使用 Flask 框架构建第一个 Web 应用的步骤。首先通过 `pip install Flask` 安装框架,然后编写基本的 Python 代码创建应用,包括定义路由和响应。示例展示如何显示 &quot;Hello, World!&quot;,并扩展到显示用户信息的功能。利用模板(如 `index.html`)可使页面更丰富。随着学习深入,可以利用 Flask 的更多特性,如表单处理和数据库连接,来构建更复杂的 Web 应用。本文旨在激发读者对 Flask 和 Web 开发的兴趣,鼓励不断探索和实践。
76 7
|
2月前
|
开发框架 中间件 数据库
Django 框架入门全攻略:轻松构建 Web 应用
【5月更文挑战第18天】本文是 Django 入门教程,介绍了如何使用 Django 构建 Web 应用。内容包括安装、项目与应用创建、模型定义、数据库迁移、视图编写、路由配置、模板系统、表单处理和中间件的使用。通过实例展示了 Django 基本流程,帮助初学者快速上手。Django 提供高效工具,便于开发者聚焦业务逻辑,轻松构建功能丰富的 Web 应用。
50 5
|
2月前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些