SiteMap und URL-Routing
-
24-09-2019 - |
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:
-
Was ist der richtige Weg, um die doppelten SiteMapNode Urls?
zu handhaben
-
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 -
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?
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