程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 體驗.net2.0的優雅(3) 為您的SiteMap添加、控制轉發功能

體驗.net2.0的優雅(3) 為您的SiteMap添加、控制轉發功能

編輯:關於.NET

首先看一下一個標准的SiteMap文件(Visual Web Developer  自帶)

<?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>

在ASP.net 頁面中可以利用這個SiteMap 文件和 menu 控件配合生成網站目錄,也可以用來和SiteMapPath 控件配合生成 “您現在的位置”。但是遺憾的是缺沒有一個簡單的辦法利用此文件來進行控制轉發。在 Struts Framework 裡面,控制轉發卻是一個非常重要的功能,被人大肆的吹噓---優雅。不過你不用急,在ASP.net裡面,我們可以用幾行代碼完成這個操作。

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

/**//// <summary>
/// The helper class for sitemap
/// </summary>
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;
        }
     }

    /**//// <summary>
    /// get url for title
    /// </summary>
    /// <param name="key">title</param>
    /// <returns>url string for the title</returns>
    public static string FindForward(string key)
    {
        return siteMapCol[key];
    }

    /**//// <summary>
    /// get url for title
    /// </summary>
    /// <param name="key">title</param>
    /// <param name="paramsFormat">parameters format</param>
    /// <param name="paramsValue">parameters value</param>
    /// <returns>url string for the title</returns>
    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 Tranfer(string key)
    {
        HttpContext.Current.Server.Transfer(FindForward(key));
    }

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

以上是 FindForward, Forward , Transfer 三個方法的共六個重載,其中3個是可以給URL加參數的

FindForward : 可以根據 SiteMap 中的 title 找到對應的 URL

Forward :直接轉發到  SiteMap 中 相應 title 對應的 URL 上去

Transfer :跟 Forward 功能,但是是在服務器端轉發(保留了Context),也就是說浏覽器看到的地址不變

實現原理很簡單,我們在靜態構造函數裡面使用 SiteMap 提供的API把 SiteMap 讀取出來存儲到了一個集合裡面,在需要的時候我們從集合眾查找 URL ,僅此而已。

把以上代碼存為 cs 文件,放在 App_Code裡面,就可以安全放心的使用了 。

以下是使用實例:

Response.Write(MySiteMap.FindForward("Details"));

MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);

打印的結果:

/MyWebSite/Details.aspx?AlbumID=1&Page=4

不過盡管如此,還是有一個小小的遺憾,因為 vs 2005 為資源文件和配置文件都提供了生成強類型訪問的機制,卻沒有為SiteMap 提供類似的機制,也就是說如果 title 書寫錯誤的話,仍然只能得到運行時檢查。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved