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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM