• 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

  • 相关阅读:
    2020-12-13 助教一周总结(第十五周)
    2020-12-06 助教一周总结(第十四周)
    2020-11-29 助教一周总结(第十三周)
    2020-11-22 助教一周总结(第十二周)
    2020-11-15 助教一周总结(第十一周)
    暗时间读后感
    2020-11-08 助教一周总结(第十周)
    软件工程助教总结
    2020-12-27助教一周总结(第十七周)
    2020-12-20助教一周总结(第十六周)
  • 原文地址:https://www.cnblogs.com/aarond/p/RouteTabble.html
Copyright © 2020-2023  润新知