Pregunta

Tengo una pregunta similar a la descrita aquí:
ASP.NET Web Forms con el URL de enrutamiento - Uso del mapa del sitio

Mi ASP.Net Web Forms aplicación web tiene un mapa del sitio, similar a esto:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="Root">
    <siteMapNode url="Home" title="Home" />
      <siteMapNode url="Home?" title="Home" />
      <siteMapNode url="Faq" title="FAQ" />
    </siteMapNode>
    <siteMapNode url="Reports" title="Your reports" />
      <siteMapNode url="Reports?" title="Your reports" />
      <siteMapNode url="ExtraReports" title="Extra reports" />
    </siteMapNode>
    <siteMapNode url="Presentations" title="Your presentations" />
      <siteMapNode url="Presentations?" title="Your presentations" />
      <siteMapNode url="ExtraPresentations" title="Extra presentations" />
    </siteMapNode>
 </siteMapNode>

Me gustaría tener la URL con el siguiente formato:
: // host / proyectos / {empresa} / {} projectno / Inicio
: // host / proyectos / Microsoft / 10 / Inicio
: // host / proyectos / Microsoft / 11 / Informes
: // host / proyectos / manzana / 10 / ExtraReports

La URL encaminamiento encaminan / proyectos / {empresa} / {projectno} / {nombre de la página} a /Pages/{pagename}.aspx.

Mi navegación consiste en una TabStrip en la parte superior que debe contener Hogar, informes y presentaciones y un menú a la izquierda con sus elementos secundarios (por ejemplo, con el seleccionado debe ser: Inicio, Faq ).

Mis preguntas:

  1. ¿Cuál es la forma correcta de manejar las URLs SiteMapNode duplicado?

  2. ¿Cómo evito que el TabStrip de generar URLs como:: // host / Hogar y: // host / ExtraReports
    I necesidad de mantener la sociedad actual y projectno selección, y el mapa del sitio hace caso omiso de las direcciones URL relativas

  3. El TabStrip y controles de los menús tienen que reconocer los elementos seleccionados para mostrar la selección activa. ¿Cuál es la solución adecuada a todo esto?

¿Fue útil?

Solución

Después de pasar unas horas en esto, yo creo que he llegado a un bien (lo suficientemente :)) solución.

archivo Mapa del sitio
Aviso de los nodos sin url apuntará a la matriz     

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
    <siteMapNode>
        <siteMapNode title="Home" url="Home">
            <siteMapNode title="Home" />
            <siteMapNode title="xxx" url="Cycle"/>
            <siteMapNode title="yyy" url="Survey" />
            <siteMapNode title="zzzteam" url="Team" />
        </siteMapNode>
        ...

clase de utilidad para generar la URL
CurrentContext es una referencia estática a la RequestContext

public static string GetPageUrl(SiteMapNode node) {
   RouteValueDictionary values = new RouteValueDictionary(CurrentContext.RouteData.DataTokens);
   values["page"] = node.Url.Trim('/');

   return CurrentContext.RouteData.Route.GetVirtualPath(CurrentContext, values).VirtualPath;
}

eventos de enlace de datos en el MasterPage
La navegación es un Telerik Barra de pestañas, subnavegación es el menú de ASP.Net

private void navigation_TabDataBound(object sender, Telerik.Web.UI.RadTabStripEventArgs e) {
   if (!String.IsNullOrEmpty(e.Tab.NavigateUrl)) {              
          SiteMapNode node = (SiteMapNode) e.Tab.DataItem;

   // Is this tab a parent of the current navigation node? Then select it
   if (SiteMap.CurrentNode.IsDescendantOf(node)) e.Tab.Selected = true;
          e.Tab.NavigateUrl = XRouteHandler.GetPageUrl(node);
   }
}

private void subNavigation_MenuItemDataBound(object sender, MenuEventArgs e) {
    SiteMapNode itemNode = (SiteMapNode) e.Item.DataItem;
    SiteMapNode currentNode = SiteMap.CurrentNode;

    // SiteMapNodes without url will point to the parent node
    if (String.IsNullOrEmpty(itemNode.Url)) {
        itemNode = itemNode.ParentNode;
        e.Item.Selectable = true;
    }

    // Is this menu item the node itself or one of it's parents? Then select it
    if (currentNode == itemNode || currentNode.IsDescendantOf(itemNode))
        e.Item.Selected = true;
        e.Item.NavigateUrl = XRouteHandler.GetPageUrl(itemNode);
    }
}

aplicación XmlSiteMapProvider
Esta solución es lo suficientemente bueno, por ahora, se verá en ella más tarde para prettify que:)

public override SiteMapNode FindSiteMapNode(HttpContext context) {
        string pageName = context.Request.Url.Segments.Last().Trim('/');
        foreach (SiteMapNode node in SiteMap.RootNode.GetAllNodes())
                if (node.Url.EndsWith(pageName, StringComparison.InvariantCultureIgnoreCase)) return node;
        return SiteMap.RootNode;
}

Otros consejos

Zyphax,

Lo más probable es que vas a tener que volver a escribir la TabStrip y controles de menú para tener en cuenta las rutas. Esto también significaría que usted podría quitar los duplicados SiteMapNodes.

En su lugar, tendría que escribir algo de código para recorrer el árbol SiteMap para obtener el ancestro más lejano que es un hijo de la página de inicio. Este es un método de extensión que podría ayudar.

public SiteMapNode FurthestAncestor(this SiteMapNode node)
{
    while (node.Key !=  this.RootNode.Key && node.ParentNode.Key != this.RootNode.Key)
    {
        node = node.ParentNode;
    }

    return node;
}

También el uso de URLs relativas le ayudará ../ Presentaciones en lugar de / proyectos / manzana / 10 / Presentaciones

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top