SiteMap, mapa de site, é muito útil na hora de construir um site. Ele pode ser vinculado diretamente aos controles Men e TreeView, e há um controle SiteMapPath indicando o caminho atual, que também pode ser vinculado diretamente.
Esta é a definição XML comumente usada:
<siteMapNode url="Curso/Grupo/GroupList.aspx" title="GroupAdmin" >
As permissões deste SiteMap foram combinadas com Membership, e os mapas vistos por usuários com diferentes permissões foram controlados. O atributo role pode ser configurado para estender as permissões de acesso para exceções. Observe que esta é uma exceção à permissão de acesso.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">Aqui estão algumas introduções :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple O uso não será descrito em detalhes aqui, mas discutiremos como estendê-lo para que possa acessar recursos com parâmetros.
Primeiro introduza esse recurso: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
Este amigo forneceu uma ferramenta que pode encaminhar solicitações com parâmetros no programa, como: MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
Na verdade, é simples e prático.
A função que queremos agora é: como cada nível de líquido requer parâmetros diferentes, na ausência desses parâmetros, o usuário fica proibido de acessar aquela página e em vez disso acessa a página pai, recursivamente.
Em primeiro lugar, o próprio SiteMap possui um evento SiteMapResolve, que é acionado quando o caminho atual é analisado. Este é um trecho de código do MSDN
private void Page_Load(object sender, EventArgs e) .
{
// O método ExpandForumPaths é chamado para tratar
// o evento SiteMapResolve.
SiteMap.SiteMapResolve +=
novo SiteMapResolveEventHandler(this.ExpandForumPaths);
}
private SiteMapNode ExpandForumPaths (remetente do objeto, SiteMapResolveEventArgs e)
{
// O nó atual representa uma página Post em um fórum de boletim informativo.
// Clone o nó atual e todos os seus pais relevantes This.
// retorna um nó do mapa do site que um desenvolvedor pode então
// caminha, modificando cada propriedade node.Url por vez.
// Como os nós clonados são separados dos nós subjacentes
// estrutura de navegação do site, os ajustes feitos não
//efetua a estrutura geral de navegação do site.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode;
// Obtenha os IDs recentes.
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// O nó atual e seus pais podem ser modificados para incluir
// informações dinâmicas de querystring relevantes para o momento
//executando solicitação.
if (0! = postID)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((nulo! = (tempNode = tempNode.ParentNode)) &&
(0! = ID do fórum))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((nulo! = (tempNode = tempNode.ParentNode)) &&
(0! = forumGroupID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
retornar nó atual;
}
Este código apenas carrega parâmetros para o caminho atual.
Tentei usar um método semelhante, mas depois que o SiteMapPath foi corrigido, o Menu não pôde ser vinculado aos dados. E apenas uma parte dos dados pode ser processada.
Posteriormente, combinado com a classe SiteMapTool, escrevi várias funções para resolver este problema. Este é o arquivo de mapa do site modificado, com um item de configuração adicionado: regra, e os parâmetros dentro são os parâmetros necessários para esta página. Caso o contexto atual não possua estes parâmetros, o usuário fica proibido de acessar esta página.
<siteMapNode url="Curso/Grupo/GroupDetail.aspx" title="Detalhe do grupo" regra="cid;gid">
Estas são duas funções que processam todos os caminhos recursivamente. string privada MakeURL (nó SiteMapNode)
{
node.ReadOnly = falso;
//encontra a URL estática
string url = MySiteMap.FindForward(node.Title);
if (node["rule"] != null && node["rule"].Comprimento > 0)
{
//se tiver a regra, então verifique
string[] paramSet = node["rule"].Split(';');
//verificar
for (int i = 0; i <paramSet.Length; i++)
{
//se a solicitação não tiver esse parâmetro, então invoque self para verificar seu pai
if (HttpContext.Current.Request.Params[paramSet[i]] == nulo)
retornar MakeURL(node.ParentNode);
}
//se for aprovado, adicione todos os parâmetros e retorne o valor
url+= "?";
for (int i = 0; i <paramSet.Length; i++)
{
string chave = paramSet[i];
//'cid'--->'cid=1'. o formato anterior é como: regra='cid;tid'.
url = url + chave + "=" + HttpContext.Current.Request.Params[chave] + "&";
}
return url.Substring(0, url.Length - 1); //remover último '&'
}
outro
{
//se não houver regra então retorne a url diretamente
url de retorno;
}
} privado void ReBindData (raiz do SiteMapNode)
{
string url = MakeURL(raiz);
se (url! = "")
raiz.Url = url;
for (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
} Chame a função MakeUrl recursivamente em ReBindData.
A função MySiteMap.FindForward chamada na função MakeUrl vem da implementação de http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
Porém, algumas mudanças precisam ser feitas após a aplicação: sua implementação original utiliza classes estáticas para carregar assim
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator ou seja = smc.GetEnumerator();
//while (ou seja,MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
//} Porém, como o usuário é limitado por permissões quando não está logado, as páginas que ele pode acessar são limitadas, portanto SiteMap.RootNode.GetAllNodes();
A maneira de alterá-lo é escrever você mesmo uma função, ler o arquivo xml diretamente e obter todas as definições de dados recursivamente.
Fonte: BLOG Faça o que quiser