SiteMap, plan de site Web, est très utile lors de la création d'un site Web. Il peut être lié directement aux contrôles Men et TreeView, et il existe un contrôle SiteMapPath indiquant le chemin actuel, qui peut également être lié directement.
Voici sa définition XML couramment utilisée :
<siteMapNode url="Course/Group/GroupList.aspx" title="GroupAdmin" >
Les autorisations de ce SiteMap ont été combinées avec l'adhésion et les cartes vues par les utilisateurs avec des autorisations différentes ont été contrôlées. L'attribut role peut être configuré pour étendre les autorisations d'accès pour les exceptions. Notez qu'il s'agit d'une exception à l'autorisation d'accès.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">Voici quelques introductions :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple Son utilisation ne sera pas décrite en détail ici, mais nous verrons comment l'étendre pour qu'il puisse accéder à des ressources avec des paramètres.
Introduisez d'abord une telle ressource : MySiteMapTool : http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
Cet ami a fourni un outil capable de transmettre des requêtes avec des paramètres dans le programme, tels que : MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
C'est effectivement simple et pratique.
La fonction que nous souhaitons maintenant est la suivante : comme chaque niveau de liquide nécessite des paramètres différents, en l'absence de ces paramètres, l'utilisateur n'a pas le droit d'accéder à cette page et accède à la place à la page parent, de manière récursive.
Tout d'abord, SiteMap lui-même a un événement SiteMapResolve, qui est déclenché lorsque le chemin actuel est analysé. Il s'agit d'un morceau de code de MSDN
private void Page_Load (expéditeur d'objet, EventArgs e).
{
// La méthode ExpandForumPaths est appelée pour gérer
// l'événement SiteMapResolve.
SiteMap.SiteMapResolve +=
nouveau SiteMapResolveEventHandler(this.ExpandForumPaths) ;
}
SiteMapNode ExpandForumPaths privé (expéditeur d'objet, SiteMapResolveEventArgs e)
{
// Le nœud actuel représente une page de publication dans un forum de discussion.
// Clonez le nœud actuel et tous ses parents concernés.
// renvoie un nœud de plan de site qu'un développeur peut ensuite
// marche, en modifiant tour à tour chaque propriété node.Url.
// Puisque les nœuds clonés sont séparés du sous-jacent
// structure de navigation du site, les corrections apportées ne le font pas
// affecte la structure globale de navigation du site.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode;
// Obtenez les identifiants récents.
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// Le nœud actuel et ses parents peuvent être modifiés pour inclure
// informations de chaîne de requête dynamique pertinentes pour le moment
// exécution de la requête.
si (0 != postID)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != ID forum))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != IDGroupeForum))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
renvoie le nœud actuel ;
}
Ce code charge simplement les paramètres du chemin actuel.
J'ai essayé d'utiliser une méthode similaire, mais une fois SiteMapPath corrigé, Menu n'a pas pu être lié aux données. Et seule une partie des données peut être traitée.
Plus tard, en combinaison avec la classe SiteMapTool, j'ai écrit plusieurs fonctions pour résoudre ce problème. Il s'agit du fichier de plan de site modifié, avec un élément de configuration ajouté : règle, et les paramètres à l'intérieur sont les paramètres requis pour cette page. Si le contexte actuel ne dispose pas de ces paramètres, il est interdit à l'utilisateur d'accéder à cette page.
<siteMapNode url="Course/Group/GroupDetail.aspx" title="Détails du groupe" règle="cid;gid">
Ce sont deux fonctions qui traitent tous les chemins de manière récursive. chaîne privée MakeURL (nœud SiteMapNode)
{
node.ReadOnly = false;
//trouver l'url statique
chaîne url = MySiteMap.FindForward(node.Title);
if (node["rule"] != null && node["rule"].Length > 0)
{
//si vous avez la règle, alors vérifiez
string[] paramSet = node["rule"].Split(';');
//vérifier
pour (int i = 0; i < paramSet.Length; i++)
{
// si la requête n'a pas un tel paramètre, alors invoquez self pour vérifier son parent
if (HttpContext.Current.Request.Params[paramSet[i]] == null)
return MakeURL(node.ParentNode);
}
//si réussi, ajoutez tous les paramètres et renvoyez la valeur
URL += "?";
pour (int i = 0; i < paramSet.Length; i++)
{
clé de chaîne = paramSet[i];
//'cid'--->'cid=1'. l'ancien format est comme : règle='cid;tid'
url = url + clé + "=" + HttpContext.Current.Request.Params[clé] + "&";
}
return url.Substring(0, url.Length - 1); //supprime le dernier '&'
}
autre
{
// s'il n'y a pas de règle alors renvoie directement l'url
URL de retour ;
}
} privé void ReBindData (racine SiteMapNode)
{
chaîne url = MakeURL (racine);
si (url != "")
racine.Url = url ;
pour (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
}Appelez la fonction MakeUrl de manière récursive dans ReBindData.
La fonction MySiteMap.FindForward appelée dans la fonction MakeUrl provient de l'implémentation de http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
Cependant, certaines modifications doivent être apportées après l'application : son implémentation originale utilise des classes statiques pour se charger comme ceci
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator c'est à dire = smc.GetEnumerator();
//pendant (c'est-à-dire.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
//} Cependant, étant donné que l'utilisateur est limité par les autorisations lorsqu'il n'est pas connecté, les pages auxquelles il peut accéder sont limitées, donc SiteMap.RootNode.GetAllNodes();
La façon de le modifier consiste à écrire une fonction vous-même, à lire directement le fichier XML et à obtenir toutes les définitions de données de manière récursive.
Source : BLOG Faites ce que vous voulez