SiteMap, mapa de sitios web, es muy útil a la hora de crear un sitio web. Se puede vincular directamente a los controles Men y TreeView, y hay un control SiteMapPath que indica la ruta actual, que también se puede vincular directamente.
Esta es su definición XML de uso común:
<siteMapNode url="Curso/Grupo/Lista de grupos.aspx" título="Administrador de grupo" >
Los permisos de este SiteMap se han combinado con la Membresía y se han controlado los mapas vistos por usuarios con diferentes permisos. El atributo de rol se puede configurar para ampliar los permisos de acceso para excepciones. Tenga en cuenta que esta es una excepción al permiso de acceso.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">Aquí hay algunas introducciones :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple El uso no se describirá en detalle aquí, pero discutiremos cómo extenderlo para que pueda acceder a recursos con parámetros.
Primero introduzca dicho recurso: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
Este amigo ha proporcionado una herramienta que puede reenviar solicitudes con parámetros en el programa, como: MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
De hecho, es simple y práctico.
La función que queremos ahora es: debido a que cada nivel de líquido requiere parámetros diferentes, en ausencia de estos parámetros, el usuario tiene prohibido acceder a esa página y en su lugar accede a la página principal, de forma recursiva.
En primer lugar, el propio SiteMap tiene un evento SiteMapResolve, que se activa cuando se analiza la ruta actual. Este es un fragmento de código de
Page_Load privado de MSDN (remitente del objeto, EventArgs e).
{
// Se llama al método ExpandForumPaths para manejar
// el evento SiteMapResolve.
Mapa del sitio.SiteMapResolve +=
nuevo SiteMapResolveEventHandler (this.ExpandForumPaths);
}
SiteMapNode privado ExpandForumPaths (remitente del objeto, SiteMapResolveEventArgs e)
{
// El nodo actual representa una página de publicación en un foro de tablón de anuncios.
// Clona el nodo actual y todos sus padres relevantes.
// devuelve un nodo de mapa del sitio que luego un desarrollador puede
// caminar, modificando cada propiedad node.Url por turno.
// Dado que los nodos clonados están separados del subyacente
// estructura de navegación del sitio, las correcciones que se realizan no
// afecta la estructura general de navegación del sitio.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone (verdadero);
SiteMapNode tempNode = currentNode;
// Obtener los ID recientes.
int forumIDGroupID = GetMostRecentForumGroupID();
int ID del foro = GetMostRecentForumID (ID del grupo del foro);
int postID = GetMostRecentPostID(forumID);
// El nodo actual y sus padres se pueden modificar para incluir
// información de cadena de consulta dinámica relevante para el momento
// ejecutando solicitud.
si (0! = ID de publicación)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
si ((nulo! = (tempNode = tempNode.ParentNode)) &&
(0 != ID del foro))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
si ((nulo! = (tempNode = tempNode.ParentNode)) &&
(0! = ID de grupo del foro))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
devolver nodoactual;
}
Este código simplemente carga parámetros para la ruta actual.
Intenté usar un método similar, pero una vez que se solucionó SiteMapPath, el Menú no se pudo vincular a los datos. Y sólo se puede procesar una parte de los datos.
Más tarde, en combinación con la clase SiteMapTool, escribí varias funciones para resolver este problema. Este es el archivo de mapa del sitio modificado, con un elemento de configuración agregado: regla, y los parámetros internos son los parámetros necesarios para esta página. Si el contexto actual no tiene estos parámetros, el usuario tiene prohibido acceder a esta página.
<siteMapNode url="Curso/Grupo/GroupDetail.aspx" title="Detalle del grupo" rule="cid;gid">
Estas son dos funciones que procesan todas las rutas de forma recursiva. cadena privada MakeURL (nodo SiteMapNode)
{
nodo.ReadOnly = falso;
//busca la URL estática
URL de cadena = MySiteMap.FindForward(nodo.Título);
if (nodo["regla"]! = nulo && nodo["regla"].Longitud > 0)
{
//si tienes la regla, entonces verifica
cadena[] paramSet = nodo["regla"].Split(';');
//controlar
para (int i = 0; i < paramSet.Length; i++)
{
//si la solicitud no tiene ese parámetro, entonces invoca a self para verificar su padre
si (HttpContext.Current.Request.Params[paramSet[i]] == nulo)
devolver MakeURL(nodo.ParentNode);
}
//si pasa, entonces agrega todos los parámetros y devuelve el valor
dirección URL += "?";
para (int i = 0; i < paramSet.Length; i++)
{
clave de cadena = paramSet[i];
//'cid'--->'cid=1'. el formato anterior es como: regla='cid;tid'.
url = url + clave + "=" + HttpContext.Current.Request.Params[clave] + "&";
}
return url.Substring(0, url.Length - 1); //eliminar el último '&'
}
demás
{
//si no hay ninguna regla, devolvemos la URL directamente
URL de retorno;
}
} ReBindData vacío privado (raíz de SiteMapNode)
{
URL de cadena = MakeURL(raíz);
si (url! = "")
raíz.Url = URL;
para (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(raíz.ChildNodes[i]);
}
} Llame a la función MakeUrl de forma recursiva en ReBindData.
La función MySiteMap.FindForward llamada en la función MakeUrl proviene de la implementación de http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
Sin embargo, es necesario realizar algunos cambios después de la aplicación: su implementación original usa clases estáticas para cargar así
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator es decir = smc.GetEnumerator();
//mientras (es decir, MoveNext())
//{
// siteMapCol[((SiteMapNode)es decir.Current).Title] = ((SiteMapNode)es decir.Current).Url;
//} Sin embargo, dado que el usuario está limitado por permisos cuando no inicia sesión, las páginas a las que puede acceder son limitadas, por lo que SiteMap.RootNode.GetAllNodes(); no obtiene todos los datos, puede que solo sean parte o 0.
La forma de cambiarlo es escribir una función usted mismo, leer el archivo xml directamente y obtener todas las definiciones de datos de forma recursiva.
Fuente: BLOG Haz lo que quieras