好得很程序员自学网

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

WebForm开发中的路由功能

WebForm开发中的路由功能

WebForm开发中的路由功能

前言

在System.Web.Routing命名空间中存在着这么一个对象,能够实现传统webform开发下的路由功能:RouteTable,实际上ASP.NET MVC框架也是依赖于此的。本篇就讲讲在传统webform开发中如何实现url rewrite功能(以前要实现这功能,那是相当的…)

入题
下面以新闻查看为sample,比如,原先传统webform开发,大多是如下的url方式:http://xxxx/newsdetail.aspx?newsId=100,如今,通过路由功能,能很方便的实现转换成SEO友好的方式,如:http://xxxx/news/新闻标题, 对于搜索引擎和人类来说可是相当友好了。简单的代码分成如下两步:

进入Global中定义路由

 void  Application_Start( object   sender, EventArgs e)
        {
            RouteTable.Routes.MapPageRoute(  "  r1  " ,  "  news/{uid}  " ,  "  ~/NewsDetail.aspx  "  );
        } 

 在NewsDetail.aspx文件中使用新的路由参数

 <  head   runat  ="server"  > 
     <  title  >  <%  =  NewsTitle  %>  - Aaron </  title  > 
 </  head  > 
 <  body  > 
     <  form   id  ="form1"   runat  ="server"  > 
     <  div  > 
         <  strong  >  <%  =  NewsTitle  %>  </  strong  > 
     </  div  > 
     </  form  > 
 </  body  > 

 public   partial   class   NewsDetail : System.Web.UI.Page
    {
          public   string  NewsTitle {  get ;  set  ; }

          protected   void  Page_Load( object   sender, EventArgs e)
        {
              this .NewsTitle =  string .Format( "  新闻标题 {0}  " ,  this .RouteData.Values[ "  uid  "  ]);
        }
    } 

运行效果如下图:

 

 现在直接访问具体的新闻是可以了,但是如果用户只输入 http://localhost:3742/news 呢?就报错啦(因为这个url格式不符合路由,因此报404错误):

有2个办法,要么增加一条路由记录,要么为目前这条路由设置默认值,我们来看设置默认值得方式吧:

 var  defaults =  new  RouteValueDictionary { {  "  uid  " ,  "  默认新闻  "   } };
            RouteTable.Routes.MapPageRoute(  "  r1  " ,  "  news/{uid}  " ,  "  ~/NewsDetail.aspx  " ,  false , defaults);

此时通过这么一Compile,再访问 http://localhost:3742/news , 就不会报错了,如下图:

上面说到的路由,除了url外,还有个参数uid,对于NewsDetail.aspx中的代码来说,也就这么一个uid参数,但是,假如我想加入一些固定的参数配置呢?比如:打算做一次email营销,要统计因为email营销而得到的访问量,我们就这样做吧(下面这个做法不专业,只是讲解路由参数的用法):

修改Global代码,给email营销渠道增加相应的路由设置、为新渠道设置固定参数source为"渠道A":

 void  Application_Start( object   sender, EventArgs e)
        {
              var  defaults =  new  RouteValueDictionary { {  "  uid  " ,  "  默认新闻  "   } };
            RouteTable.Routes.MapPageRoute(  "  r1  " ,  "  news/{uid}  " ,  "  ~/NewsDetail.aspx  " ,  false  , defaults);

              var  dataTokens =  new  RouteValueDictionary { {  "  source  " ,  "  渠道A  "   } };
            RouteTable.Routes.MapPageRoute(  "  r2  " ,  "  newsTuiGuang001/{uid}  " ,  "  ~/NewsDetail.aspx  " ,  false , defaults,  null  , dataTokens);
        } 

修改NewsDetail.aspx.cs,让代码能够处理这个新增的source参数:

 public   partial   class   NewsDetail : System.Web.UI.Page
    {
          public   string  NewsTitle {  get ;  set  ; }

          protected   void  Page_Load( object   sender, EventArgs e)
        {
              this .NewsTitle =  string .Format( "  新闻标题 {0}  " ,  this .RouteData.Values[ "  uid  "  ]);

              if  ( this .RouteData.DataTokens[ "  source  " ] !=  null  )
            {
                  this .NewsTitle +=  "  ------来源:推广渠道  "  +  this .RouteData.DataTokens[ "  source  "  ];
            }
        }
    } 

编译,运行:

搞定,哈哈,从代码中得知,固定参数的传递是通过RouteData.DataTokens数组来传递的。

大家要是对路由映射有兴趣,就看看 蒋金楠(Artech) 的博客吧: http://www.cnblogs.com/artech/archive/2012/03/20/aspnet-routing-02.html

自省推动进步,视野决定未来。

 

分类:  ASP.NET MVC

作者: Leo_wl

    

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

    

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

版权信息

查看更多关于WebForm开发中的路由功能的详细内容...

  阅读:45次