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

原文地址:https://www.cnblogs.com/aarond/p/RouteTabble.html