在上次介紹過 SiteMapPath WebControl 製作網頁路徑後,相信各位應該會碰到帶 QueryString 時,會發生SiteMapPath指錯路徑,譬如以上次介紹 [ASP.NET 2.0] SiteMapPath WebControl 一文中的 web.sitemap 為例:[xml]
其中有指定 Album、Album[Mode 1]、Album[Mode 2] 三個網址,而所指的網頁是同一頁,只是 QueryString 不同而已
假如只是這樣,還不會有啥問題,但要是還帶有其他參數時,問題就發生了
譬如 Album[Mode 1] 網頁中有一網址為 Album/Default.aspx?md=1&id=1234
當連結至這個網址時,SiteMapPath 理當要指到 Album[Mode 1],但他卻指到 Album (或更上層的節點),這樣就不對了呀!怎麼辦?
很簡單,我們只要覆寫 (override) XmlSiteMapProvider.SiteMapNode FindSiteMapNode (string rawUrl) 這個方法 (Method) 就可以囉!
程式如下:
[csharp]using System;
using System.Web;
public class mySiteMapProvider : XmlSiteMapProvider {
public mySiteMapProvider() { }
public override SiteMapNode FindSiteMapNode(string rawUrl) {
// 先利用原有的FindSiteMapNode()方法,尋找傳進來的網址,是否有該節點
SiteMapNode smn = base.FindSiteMapNode(rawUrl);
if (smn == null) {
// 找不到該節點
// 2005/08/04 15:54 Bug 修正
// 原錯誤段
// string sPage = rawUrl.Split(‘?’)[0]; // 取回網頁網址
// string sQuery = rawUrl.Split(‘?’)[1]; // 取得QueryString
string[] arrUrl = rawUrl.Split(‘?’);
string sPage = arrUrl[0]; // 取回網頁網址
string sQuery = string.Empty;
if (arrUrl.Length >= 2)
sQuery = arrUrl[1]; // 取得QueryString
// Bug 修正完畢
string[] aQuery = sQuery.Split(‘&’); // 將QueryString拆解
for (int i = 0; i < aQuery.Length; i++) {
// 在利用網頁網址與拆解的QueryString去尋找節點
smn = base.FindSiteMapNode(sPage + "?" + aQuery[i]);
if (smn != null) {
// 找到了就離開迴圈
break;
}
}
if (smn == null) {
// 會執行到這裡代表就算是網頁網址加上QueryString,還是找不到
// 乾脆回傳網頁網址的節點
smn = base.FindSiteMapNode(sPage);
}
}
// 將節點丟出去給SiteMapPath WebControl Or TreeView WebControl接
return smn;
}
}[/csharp]
除了要製作 mySiteMapProvider Class 之外,還要修改 Web.Config 這個檔,改成:
[xml]
好啦!這樣就不怕有上述的問題發生囉! ^^