好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ASP.NET的路由系统:根据路由规则生成URL

ASP.NET的路由系统:根据路由规则生成URL

前面我们已经提到过,ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过注册的路由规测生成一个相应的URL。后者通过调用RouteCollection类型的GetVirtualPath方法来实现。[源代码从 这里 下载]

如下面的代码片断所示,GetVirtualPath定义了两个GetVirtualPath方法重载,它们共同的参数requestContext和values分别表示请求上下文(RouteData和HTTP上下文的封装)和用于替换定义在URL模板中的变量站位符的值。另一个GetVirtualPath方法具有一个额外的字符串参数name,它表示集合中具体使用的路由对象的注册名称(调用MapPageRoute方法时指定的第一个参数)。而AppendTrailingSlash和LowercaseUrls决定在对生成的URL进行规范化的时候是否添加一个“/”字符(如果没有),以及是否需要将URL转化为小写。

    1:   public   class  RouteCollection : Collection<RouteBase>
    2:  {    
    3:       //其他成员 
    4:       public  VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
    5:       public  VirtualPathData GetVirtualPath(RequestContext requestContext,  string  name, RouteValueDictionary values);
    6:           
    7:       public   bool  AppendTrailingSlash {  get;  set; }
    8:       public   bool  LowercaseUrls {  get;  set; } 
    9:  }

如果调用GetVirtualPath方法时没有指定具体采用的路由对象,会遍历整个集合的每个路由对象并调用其GetVirtualPath方法,如果返回的VirtualPathData不会Null则直接将其作为返回值;否则(找不到匹配的路由对象)返回Null。如果在调用GetVirtualPath确定了具体使用的路由对象,则直接调用该路由对象的GetVirtualPath方法并返回其执行结果。

我们在调用GetVirtualPath方法的时候可以传入Null作为第一个参数(requestContext),在这种情况下会基于当前HTTP上下文(对应于HttpContext的静态属性Current)创建一个RequestContext对象作为调用路由对象GetVirtualPath方法的同名参数,该参数包含一个空的RouteData对象。如果当前HTTP上下文不存在则直接抛出一个InvalidOperationException异常。

路由对象针对GetVirtualPath方法而进行的路由匹配只要求URL模板中定义的变量的值都能被提供,而这些变量值具有三种来源,分别是路由对象定义的默认变量值、指定RequestContext的RouteData提供的变量值(Values属性)和手工提供的变量值(通过values参数指定的RouteValueDictionary对象),这三种变量值的选择优先级由低到高。

同样以之前定义关于获取天气信息的URL模板为例,我们在Weather.aspx页面的后台代码中通过如果如下的代码调用RouteTable和Routes熟悉的GetVirtualPath方法生成三个具体的URL。

    1:   public   partial   class  Weather : Page
    2:  {
    3:       protected   void  Page_Load( object  sender, EventArgs e)
    4:      {
    5:          RouteData routeData =  new  RouteData();
    6:          routeData.Values.Add( "areaCode" , "0512" );
    7:          routeData.Values.Add( "days" , "1" );
    8:          RequestContext requestContext =  new  RequestContext();
    9:          requestContext.HttpContext =  new  HttpContextWrapper(HttpContext.Current);
   10:          requestContext.RouteData = routeData;
   11:   
   12:          RouteValueDictionary values =  new  RouteValueDictionary();
   13:          values.Add( "areaCode" ,  "028" );
   14:          values.Add( "days" ,  "3" );
   15:   
   16:          Response.Write(RouteTable.Routes.GetVirtualPath( null , null ).VirtualPath +  "<br/>" );
   17:          Response.Write(RouteTable.Routes.GetVirtualPath(requestContext,  null ).VirtualPath +  "<br/>" );
   18:          Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath +  "<br/>" );
   19:      }
   20:  }

从上面的代码片断我们可以看到:第一次调用GetVirtualPath方法传输的requestContext和values参数均为Null;第二次则指定了一个手工创建的RequestContext对象,其RouteData的Values属性具有两个变量(areaCode=0512;days=1),而values参数依然为Null;第三次我们同时为参数requestContext和values指定了具体的对象,而后者包含两个参数(areaCode=028;days=3)。在浏览器上访问Weather.aspx页面会得到如下图所示的3个URL。这充分证实了上面提到的关于变量选择优先级的结论。

ASP.NET的路由系统:URL与物理文件的分离  
ASP.NET的路由系统:路由映射  
ASP.NET的路由系统:根据路由规则生成URL

作者: Artech
出处: http://artech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于ASP.NET的路由系统:根据路由规则生成URL的详细内容...

  阅读:39次

上一篇: C#几个经常犯错误汇总

下一篇:PHP