Una de las tantas preguntas frecuentes en los grupos de noticias de asp.net y tambien de algunos amigos es de como separar los items de menú principal (y más aún cuando hay elementos de secciones privadas o de administración), aqui coloco algunos tips a tener en cuenta y lo que podemos hacer.
Filtrando los items del sitemap
En el origen de datos de sitemap tenemos la posibilidad de filtrar desde que nodo publicar los items del menu
<asp:SiteMapDataSource ID="SiteMapDataSourceMenuPrincipal" runat="server" StartingNodeUrl="~/admin/index.aspx" />
Esto es bueno cuando queremos que desde un subidirectorio solamente presentar en un submenu los items internos, pero…
De donde obtiene los items?
Como siempre digo la «magia» está en que hay un proveedor sitemap por defecto el cual obtiene los datos del web.sitemap, pero tenemos la posibilidad de agregar nuestros propios proveedores de mapas del sitio.
Para los que somos curiosos el proveedor por defecto se llama AspNetXmlSiteMapProvider y se encuentra en el web.config base, su ubicacion
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG
Separando los itemes (nodos) en archivos y como utilizarlos
Tenemos dos maneras de implementar en diferentes archivos el contenido de los items del sitemap
- En el mismo web.sitemap, asignar aun sitemapNode un archivo fisico separado
- Definir nuevos proveedores de sitemap en el web.config
OPCION 1: Para cada siteMapNone indicar en que archivo fisico se encuentran los items
Aqui podremos tener algo asi:
<siteMapNode siteMapFile="~/admin/Web.STARWARS.ADMIN.sitemap"></siteMapNode>
Donde el atributo puede ser:
- Una referencia relativa a la aplicación, como ~/admin/Web.STARWARS.ADMIN.sitemap (teniendo en cuenta signo ~ hace referencia a la appweb)
- Una ruta de acceso virtual, como /admin/… (como cualquier source en html)
- Una referencia a la ruta de acceso relativa a la ubicación del archivo del mapa del sitio actual, como admin/Web.STARWARS.ADMIN.sitemap.
OPCION 2: Implementar nuevos proveedores de sitemap
Aqui deberiamos agregar a nuestro web.config en la seccion correcta un nuevo proveedor
<siteMap enabled="true"> <providers> <add name="STARWARS.ADMIN.SiteMapProvider" description="Mapa del sector de Administracion" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="~/admin/Web.STARWARS.ADMIN.sitemap" /> </providers> </siteMap>
Es una coleccion entonces podriamos tener varios
<siteMap enabled="true">
<providers>
<add name="STARWARS.ADMIN.SiteMapProvider" ...
<add name="STARWARS.JEDIS.SiteMapProvider" ...
<add name="STARWARS.SITHS.SiteMapProvider" ....
Incluso es conveniente para una mejor administración coloar un proveedor por defecto para no estar especificandolo luego en cada lugar que deseamos utilizarlo
<siteMap defaultProvider="STARWARS.JEDIS.SiteMapProvider" enabled="true">
Y mas aun si eliminamos los anteriores (el proveedor por defecto AspNetXmlSiteMapProvider), que como es una coleccion podemos hacer un clear
<siteMap defaultProvider="STARWARS.ADMIN.SiteMapProvider" enabled="true">
<providers>
<clear/>
<add...
Para utilizar tenemos la propiedad SiteMapProvider en el SiteMapDataSource
<asp:SiteMapDataSource ID="SiteMapDataSourceMenuPrincipal" runat="server" SiteMapProvider="STARWARS.ADMIN.SiteMapProvider"/>
Enlaces:
- SiteMapDataSource.StartingNodeUrl (Propiedad)
Obtiene o establece un nodo del mapa del sitio que el origen de datos utiliza a continuación como punto de referencia para recuperar nodos de un mapa jerárquico del sitio.
http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.sitemapdatasource.startingnodeurl(VS.80).aspx - SiteMapDataSource.Provider (Propiedad)
Obtiene o establece un objeto SiteMapProvider que está asociado al control de origen de datos.
http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.sitemapdatasource.provider(VS.80).aspx - Elemento siteMap (Esquema de configuración de ASP.NET)
Define opciones de configuración para admitir la infraestructura de configuración, almacenamiento y representación de la exploración de sitios.
http://msdn2.microsoft.com/es-es/library/1e333zt4(VS.80).aspx - SiteMap (Clase)
La clase SiteMap es una representación en memoria de la estructura de exploración de un sitio, proporcionada por uno o varios proveedores del mapa del sitio. Esta clase no se puede heredar.
http://msdn2.microsoft.com/es-es/library/system.web.sitemap(VS.80).aspx - Cómo: Configurar varios mapas de sitio y proveedores de mapas de sitio
http://msdn2.microsoft.com/es-es/library/ms178426(vs.80).aspx