웹사이트 맵인 SiteMap은 웹사이트를 구축할 때 매우 유용합니다. Men 및 TreeView 컨트롤에 직접 바인딩될 수 있으며 현재 경로를 나타내는 SiteMapPath 컨트롤이 있으며 직접 바인딩할 수도 있습니다.
이것은 그가 일반적으로 사용하는 XML 정의입니다.
<siteMapNode url="코스/그룹/GroupList.aspx" title="그룹관리자" >
이 사이트맵의 권한은 멤버십과 결합되었으며, 다른 권한을 가진 사용자가 보는 지도가 제어되었습니다. 예외에 대한 액세스 권한을 확장하도록 역할 속성을 구성할 수 있습니다. 이는 접근권한의 예외이므로 참고하세요.
<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 이벤트.
사이트맵.SiteMapResolve +=
새로운 SiteMapResolveEventHandler(this.ExpandForumPaths);
}
개인 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가 수정되면 메뉴를 데이터에 바인딩할 수 없습니다. 그리고 데이터의 일부만 처리할 수 있습니다.
나중에 SiteMapTool 클래스와 결합하여 이 문제를 해결하기 위해 여러 함수를 작성했습니다. 이것은 구성 항목인 규칙이 추가된 수정된 사이트맵 파일이며, 내부 매개변수는 이 페이지에 필요한 매개변수입니다. 현재 컨텍스트에 이러한 매개변수가 없으면 사용자는 이 페이지에 액세스할 수 없습니다.
<siteMapNode url="Course/Group/GroupDetail.aspx" title="그룹 세부정보" rule="cid;gid">
이는 모든 경로를 재귀적으로 처리하는 두 가지 함수입니다. 개인 문자열 MakeURL(SiteMapNode 노드)
{
노드.ReadOnly = 거짓;
//정적 URL 찾기
string url = MySiteMap.FindForward(node.Title);
if (node["rule"] != null && node["rule"].Length > 0)
{
//규칙이 있으면 확인
string[] paramSet = node["rule"].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[key] + "&";
}
return url.Substring(0, url.Length - 1) //마지막 '&' 제거
}
또 다른
{
//규칙이 없으면 URL을 직접 반환합니다.
반환 URL;
}
} 개인 무효 ReBindData(SiteMapNode 루트)
{
문자열 url = MakeURL(루트);
if (url != "")
루트.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 즉 = smc.GetEnumerator();
//동안(ie.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
//} 그러나 사용자가 로그인하지 않은 경우 권한에 의해 제한되므로 액세스할 수 있는 페이지가 제한되므로 SiteMap.RootNode.GetAllNodes()는 모든 데이터를 가져오지 않으며 일부 또는 0일 수 있습니다.
이를 변경하는 방법은 함수를 직접 작성하고, xml 파일을 직접 읽고, 모든 데이터 정의를 재귀적으로 얻는 것입니다.
출처 : BLOG 하고 싶은 대로 하세요