首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

體驗 .NET 2.0 的優雅 (3):為 SiteMap 新增控制轉發功能

     編輯:關於.NET

標準 Web.sitemap 配合 Menu、SiteMapPath 可產生導航選單與「您現在的位置」,但缺乏控制轉發功能(Struts 強項)。在 ASP.NET 只需幾行程式碼即可補全此能力。

一、標準 SiteMap 範例


<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode title="Home" url="Default.aspx" description="This is my homepage" >
    <siteMapNode title="Resume" url="Resume.aspx" />
    <siteMapNode title="Links" url="Links.aspx" />
    <siteMapNode title="Albums" url="Albums.aspx" >
      <siteMapNode title="Photos" url="Photos.aspx" >
        <siteMapNode title="Details" url="Details.aspx" />
      </siteMapNode>
    </siteMapNode>
    <siteMapNode title="Register" url="Register.aspx" />
    <siteMapNode title="Manage" url="Admin/Albums.aspx" roles="Administrators">
      <siteMapNode title="Photos" url="Admin/Photos.aspx" >
        <siteMapNode title="Details" url="Admin/Details.aspx" />
      </siteMapNode>
    </siteMapNode>
  </siteMapNode>
</siteMap>

二、MySiteMap 輔助類別完整實作


using System;
using System.Web;
using System.Collections.Specialized;
using System.Collections;

public static class MySiteMap {
    static NameValueCollection siteMapCol;

    static MySiteMap() {
        SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
        siteMapCol = new NameValueCollection();
        IEnumerator ie = smc.GetEnumerator();
        while (ie.MoveNext()) {
            siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
        }
    }

    public static string FindForward(string key) {
        return siteMapCol[key];
    }

    public static string FindForward(string key, string paramsFormat, params object[] paramsValue) {
        return String.Format(FindForward(key) + "?" + paramsFormat, paramsValue);
    }

    public static void Forward(string key) {
        HttpContext.Current.Response.Redirect(FindForward(key));
    }

    public static void Forward(string key, string paramsFormat, params object[] paramsValue) {
        HttpContext.Current.Response.Redirect(FindForward(key, paramsFormat, paramsValue));
    }

    public static void Transfer(string key) {
        HttpContext.Current.Server.Transfer(FindForward(key));
    }

    public static void Transfer(string key, string paramsFormat, params object[] paramsValue) {
        HttpContext.Current.Server.Transfer(FindForward(key, paramsFormat, paramsValue));
    }
}

三、六個多載方法功能對照

方法功能支援參數
FindForward依 Title 取得 URL無 / 有
Forward客戶端導向 (Response.Redirect)無 / 有
Transfer伺服端轉送,保留 Context (Server.Transfer)無 / 有

四、使用範例


// 取得 URL
Response.Write(MySiteMap.FindForward("Details"));
// 輸出: /MyWebSite/Details.aspx

// 攜帶參數導向
MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
// 實際導向: /MyWebSite/Details.aspx?AlbumID=1&Page=4

五、實現原理與遺憾

  • 原理:靜態建構式中透過 SiteMap.RootNode.GetAllNodes() 讀取全站節點,建立 Title→Url 對應集合,查詢時 O(1) 取得
  • 遺憾:VS2005 為資源檔/組態檔提供強型別存取,唯獨 SiteMap 無此機制,Title 拼寫錯誤僅能在執行期發現

將類別檔置於 App_Code 即可專案全域使用,輕鬆賦予 SiteMap 控制轉發能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved