Frage

Ich habe eine Frage, ähnlich der hier beschrieben:
ASP.NET URL-Routing mit WebForms - Verwenden der SiteMap

Meine ASP.Net WebForms Webapplikation hat eine Sitemap, die ähnlich wie diese:

<?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>

Ich mag die URL in folgendem Format haben:
: // host / projects / {company} / {projectno} / Start
: // host / projects / microsoft / 10 / Startseite
: // host / projects / microsoft / 11 / Berichte
: // host / projects / Apfel / 10 / ExtraReports

Die URL-Routing Routen / projects / {company} / {projectno} / {} Seitennamen zu /Pages/{pagename}.aspx.

Meine Navigation besteht aus einem Register auf, die enthalten sollte Startseite, Berichte und Präsentationen und ein Menü auf der linken Seite mit ihren Subitems (zB mit Start ausgewählt wird, sollte es sein: Startseite, FAQ ).

Meine Fragen:

  1. Was ist der richtige Weg, um die doppelten SiteMapNode Urls?

  2. zu handhaben
  3. Wie verhindere ich das Register von der Generierung Urls wie: // host / Haus und: // host / ExtraReports
    Ich brauche die aktuelle Firma und projectno Auswahl zu halten und die Sitemap ignoriert relative URLs

  4. Das TabStrip und Menüsteuerung müssen die ausgewählten Elemente erkennen, die aktive Auswahl zu zeigen. Was ist die richtige Lösung, um all dies?

War es hilfreich?

Lösung

ein paar Stunden auf dieser Nachdem wir, denke ich, ich bin gekommen, zu einem guten (genug :)) Lösung.

Sitemap-Datei
Beachten Sie die Knoten ohne URL der übergeordneten Punkt     

<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>
        ...

Utility-Klasse der URL
erzeugen Current ist ein statischer Verweis auf die Request

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;
}

Databound Ereignisse in der Masterpage
Navigation ist ein Telerik Tabstrip, Subnavigation ist das ASP.Net-Menü

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);
    }
}

XmlSiteMapProvider Implementierung
Diese Lösung ist gut genug für jetzt, wird später darum kümmern, es zu beschönigen:)

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;
}

Andere Tipps

Zyphax,

Es ist sehr wahrscheinlich, dass Sie das TabStrip und Menüsteuerung neu zu schreiben haben werden wegen Ihrer Routen zu nehmen. Dies würde auch bedeuten, dass Sie die doppelte SiteMapNodes entfernen konnte.

Stattdessen müssen Sie einige Codes schreiben, um die SiteMap Baum zu durchqueren, die am weitesten Vorfahren zu erhalten, die ein Kind auf der Homepage ist. Dies ist eine Erweiterung Methode, die helfen könnte.

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

    return node;
}

Auch relative URLs verwenden, helfen ../ Präsentationen statt / projects / Apfel / 10 / Präsentationen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top