SiteMap, eine Website-Karte, ist beim Erstellen einer Website sehr nützlich. Es kann direkt an die Steuerelemente „Men“ und „TreeView“ gebunden werden, und es gibt ein SiteMapPath-Steuerelement, das den aktuellen Pfad angibt, das ebenfalls direkt gebunden werden kann.
Dies ist seine häufig verwendete XML-Definition:
<siteMapNode url="Course/Group/GroupList.aspx" title="GroupAdmin" >
Die Berechtigungen dieser SiteMap wurden mit der Mitgliedschaft kombiniert und die Karten, die von Benutzern mit unterschiedlichen Berechtigungen angezeigt werden, wurden kontrolliert. Das Rollenattribut kann konfiguriert werden, um die Zugriffsberechtigungen für Ausnahmen zu erweitern. Beachten Sie, dass dies eine Ausnahme von der Zugriffsberechtigung ist.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">Hier sind einige Einführungen :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple Die Verwendung wird hier nicht im Detail beschrieben, aber wir werden diskutieren, wie man sie erweitert, damit sie mit Parametern auf Ressourcen zugreifen kann.
Stellen Sie zunächst eine solche Ressource vor: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
Dieser Freund hat ein Tool bereitgestellt, das Anfragen mit Parametern im Programm weiterleiten kann, wie zum Beispiel: MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
Es ist in der Tat einfach und praktisch.
Die Funktion, die wir jetzt wollen, ist: Da für jeden Flüssigkeitsstand unterschiedliche Parameter erforderlich sind, wird dem Benutzer bei Fehlen dieser Parameter der Zugriff auf diese Seite untersagt und er greift stattdessen rekursiv auf die übergeordnete Seite zu.
Erstens verfügt SiteMap selbst über ein SiteMapResolve-Ereignis, das ausgelöst wird, wenn der aktuelle Pfad analysiert wird. Dies ist ein Codeabschnitt von MSDN
private void Page_Load(object sender, EventArgs e).
{
// Die ExpandForumPaths-Methode wird zur Verarbeitung aufgerufen
// das SiteMapResolve-Ereignis.
SiteMap.SiteMapResolve +=
neuer SiteMapResolveEventHandler(this.ExpandForumPaths);
}
private SiteMapNode ExpandForumPaths(Object sender, SiteMapResolveEventArgs e)
{
// Der aktuelle Knoten stellt eine Beitragsseite in einem Bulletin-Board-Forum dar.
// Klonen Sie den aktuellen Knoten und alle seine relevanten übergeordneten Knoten
// gibt einen Sitemap-Knoten zurück, den ein Entwickler dann verwenden kann
// gehen und jede node.Url-Eigenschaft nacheinander ändern.
// Da die geklonten Knoten vom zugrunde liegenden Knoten getrennt sind
// Site-Navigationsstruktur, die vorgenommenen Korrekturen tun dies nicht
// wirkt sich auf die gesamte Site-Navigationsstruktur aus.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode;
// Aktuelle IDs abrufen.
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// Der aktuelle Knoten und seine übergeordneten Knoten können so geändert werden, dass sie eingeschlossen werden
// dynamische Querystring-Informationen, die aktuell relevant sind
// Anfrage wird ausgeführt.
if (0 != postID)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != ForumID))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != forumGroupID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
return currentNode;
}
Dieser Code lädt lediglich Parameter für den aktuellen Pfad.
Ich habe versucht, eine ähnliche Methode zu verwenden, aber nachdem SiteMapPath repariert wurde, konnte Menu nicht an Daten gebunden werden. Und nur ein Teil der Daten kann verarbeitet werden.
Später habe ich in Kombination mit der SiteMapTool-Klasse mehrere Funktionen geschrieben, um dieses Problem zu lösen. Dies ist die geänderte Sitemap-Datei mit einem hinzugefügten Konfigurationselement: Die darin enthaltenen Parameter sind die für diese Seite erforderlichen Parameter. Verfügt der aktuelle Kontext nicht über diese Parameter, ist dem Benutzer der Zugriff auf diese Seite untersagt.
<siteMapNode url="Course/Group/GroupDetail.aspx" title="Group Detail" Rule="cid;gid">
Dabei handelt es sich um zwei Funktionen, die alle Pfade rekursiv verarbeiten. private Zeichenfolge MakeURL(SiteMapNode-Knoten)
{
node.ReadOnly = false;
//Finde die statische URL
string url = MySiteMap.FindForward(node.Title);
if (node["rule"] != null && node["rule"].Length > 0)
{
//Wenn die Regel vorliegt, dann überprüfen
string[] paramSet = node["rule"].Split(';');
//überprüfen
for (int i = 0; i < paramSet.Length; i++)
{
//Wenn die Anfrage keinen solchen Parameter hat, dann rufe self auf, um sein übergeordnetes Element zu überprüfen
if (HttpContext.Current.Request.Params[paramSet[i]] == null)
return MakeURL(node.ParentNode);
}
//Wenn bestanden, dann alle Parameter hinzufügen und den Wert zurückgeben
URL += "?";
for (int i = 0; i < paramSet.Length; i++)
{
string key = paramSet[i];
//'cid'--->'cid=1'. Das frühere Format ist wie folgt: Rule='cid;tid'
url = url + key + "=" + HttpContext.Current.Request.Params[key] + "&";
}
return url.Substring(0, url.Length - 1); //letztes '&' entfernen
}
anders
{
//Wenn es keine Regel gibt, dann die URL direkt zurückgeben
Rückgabe-URL;
}
} private void ReBindData(SiteMapNode root)
{
string url = MakeURL(root);
if (URL != "")
root.Url = URL;
for (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
}Rufen Sie die MakeUrl-Funktion rekursiv in ReBindData auf.
Die in der MakeUrl-Funktion aufgerufene MySiteMap.FindForward-Funktion stammt aus der Implementierung von http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
Nach der Anwendung müssen jedoch einige Änderungen vorgenommen werden: Die ursprüngliche Implementierung verwendet statische Klassen, um auf diese Weise zu laden
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator ie = smc.GetEnumerator();
//while (ie.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
// Da der Benutzer jedoch durch Berechtigungen eingeschränkt ist, wenn er nicht angemeldet ist, sind die Seiten, auf die er zugreifen kann, begrenzt, sodass SiteMap.RootNode.GetAllNodes(); nicht alle Daten erhält, sondern möglicherweise nur einen Teil oder 0.
Die Möglichkeit, dies zu ändern, besteht darin, selbst eine Funktion zu schreiben, die XML-Datei direkt zu lesen und alle Datendefinitionen rekursiv abzurufen.
Quelle: BLOG Machen Sie, was Sie wollen