SiteMap、つまりウェブサイトのマップは、ウェブサイトを構築するときに非常に役立ちます。これは、Men および TreeView コントロールに直接バインドでき、現在のパスを示す SiteMapPath コントロールもあり、これも直接バインドできます。
これは彼がよく使用する XML 定義です。
<siteMapNode url="コース/グループ/グループリスト.aspx" title="グループ管理者" >
このサイトマップの権限はメンバーシップと結合されており、異なる権限を持つユーザーが表示するマップが制御されています。 role 属性を設定して、例外に対するアクセス許可を拡張できます。ただし、これはアクセス許可の例外です。
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">ここにいくつかの紹介があります:
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimpleここでは使用法については詳しく説明しませんが、パラメーターを使用してリソースにアクセスできるように拡張する方法について説明します。
まずそのようなリソースを紹介します: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
この友人は、次のようなプログラム内のパラメーターを使用してリクエストを転送できるツールを提供しました。 MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
実にシンプルで実用的です。
ここで必要な機能は次のとおりです。各液面には異なるパラメータが必要であるため、これらのパラメータがない場合、ユーザーはそのページへのアクセスが禁止され、代わりに親ページに再帰的にアクセスします。
まず、SiteMap 自体には SiteMapResolve イベントがあり、現在のパスが解析されるときにトリガーされます。これは MSDN のコードの一部です
private void Page_Load(object sender, EventArgs e)。
{
// ExpandForumPaths メソッドが呼び出されて処理されます。
// SiteMapResolve イベント。
SiteMap.SiteMapResolve +=
新しい SiteMapResolveEventHandler(this.ExpandForumPaths);
}
private SiteMapNode ExpandForumPaths(オブジェクト送信者, SiteMapResolveEventArgs e)
{
// 現在のノードは掲示板フォーラムの投稿ページを表します。
// 現在のノードとその関連するすべての親のクローンを作成します。
// 開発者が使用できるサイト マップ ノードを返します。
// 各node.Urlプロパティを順番に変更しながら歩きます。
// クローン化されたノードは基礎となるノードから分離されているため、
// サイト ナビゲーション構造。作成された修正は反映されません。
// サイトのナビゲーション構造全体に影響を与えます。
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode
// 最近の ID を取得します。
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// 現在のノードとその親は、以下を含むように変更できます。
// 現在に関連する動的クエリ文字列情報
// リクエストを実行します。
if (0 != 投稿ID)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
if ((null != (tempNode = tempNode.ParentNode))
&&
(0 != フォーラムID))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
if ((null != (tempNode = tempNode.ParentNode))
&&
(0 != フォーラムグループID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
currentNode を返します
。
}
このコードは、現在のパスのパラメータをロードするだけです。
同様の方法を試してみましたが、SiteMapPathを修正してからMenuをデータにバインドできなくなりました。また、処理できるのはデータの一部だけです。
その後、SiteMapTool クラスと組み合わせて、この問題を解決するためにいくつかの関数を作成しました。これは、構成項目ルールが追加された、変更されたサイトマップ ファイルです。内部のパラメーターは、このページに必要なパラメーターです。現在のコンテキストにこれらのパラメータがない場合、ユーザーはこのページにアクセスできません。
<siteMapNode url="コース/グループ/グループ詳細.aspx" title="グループの詳細" rules="cid;gid">
これらは、すべてのパスを再帰的に処理する 2 つの関数です。 プライベート文字列 MakeURL(SiteMapNode ノード)
{
ノード.ReadOnly = false;
// 静的 URL を検索します
文字列 URL = MySiteMap.FindForward(node.Title);
if (ノード["ルール"] != null && ノード["ルール"].Length > 0)
{
// ルールがある場合はチェックします
string[] paramSet = ノード["ルール"].Split(';');
//チェック
for (int i = 0; i < paramSet.Length; i++)
{
// リクエストにそのようなパラメータがない場合は、self を呼び出して親を確認します
if (HttpContext.Current.Request.Params[paramSet[i]] == null)
MakeURL(node.ParentNode) を返します。
}
// パスした場合は、すべてのパラメータを追加して値を返します
URL += "?";
for (int i = 0; i < paramSet.Length; i++)
{
文字列キー = paramSet[i];
//'cid'--->'cid=1'。前の形式は次のようになります:rule='cid;tid'
URL = URL + キー + "= + HttpContext.Current.Request.Params[キー] + "&";
}
return url.Substring(0, url.Length - 1); //最後の '&' を削除します
}
それ以外
{
// ルールがない場合は URL を直接返します
URLを返します;
}
private void ReBindData(SiteMapNode root)
{
文字列 URL = MakeURL(ルート);
if (url != "")
root.URL = URL;
for (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
ReBindData で MakeUrl 関数を再帰的に呼び出します。
MakeUrl 関数で呼び出される MySiteMap.FindForward 関数は、 http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspxの実装に由来しています。
ただし、アプリケーションの後にいくつかの変更を行う必要があります。元の実装では静的クラスを使用して次のようにロードします。
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator ie = smc.GetEnumerator();
//while (ie.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
//} ただし、ユーザーはログインしていないときは権限によって制限されているため、アクセスできるページが制限されているため、SiteMap.RootNode.GetAllNodes() はすべてのデータを取得せず、一部または 0 しか取得できない可能性があります。
これを変更する方法は、自分で関数を作成し、xml ファイルを直接読み取り、すべてのデータ定義を再帰的に取得することです。
出典:BLOG やりたいことは何でもやる