Question

J'ai une question similaire à celle décrite ici:
ASP.NET URL de routage avec WebForms - Utilisation du SiteMap

Mon WebForms webapplication a ASP.Net un plan Sitemap, semblable à ceci:

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

Je voudrais avoir l'URL dans le format suivant:
: // hôte / projets / {entreprise} / {} projectno / Accueil
: // hôte / projets / microsoft / 10 / Accueil
: // hôte / projets / Microsoft / 11 / Rapports
: // hôte / projets / pomme / 10 / ExtraReports

Les itinéraires de routage Url / projets / {entreprise} / {projectno} / {} nompage à /Pages/{pagename}.aspx.

Ma navigation se compose d'un TabStrip sur le dessus qui doit contenir Accueil, Rapports et présentations et un menu à gauche avec leurs sous-éléments (par exemple avec sélectionné, il devrait être: Accueil, Foire Aux Questions ).

Mes questions:

  1. Quelle est la bonne façon de gérer les urls SiteMapNode en double?

  2. Comment puis-je empêcher le TabStrip de générer comme urls:: // host / Accueil et: // host / ExtraReports
    J'ai besoin de maintenir la société actuelle et projectno sélection, et le plan du site ne tient pas compte urls par rapport

  3. Le TabStrip et les commandes de menu doivent reconnaître les éléments sélectionnés pour afficher la sélection active. Quelle est la bonne solution à tout cela?

Était-ce utile?

La solution

Je pense que je l'ai Après avoir passé quelques heures à ce sujet, viens à une bonne solution (assez :)).

fichier SiteMap Notez les noeuds sans URL pointera vers le parent     

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

classe utilitaire pour générer l'URL CurrentContext est une référence statique au 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;
}

Événements DataBound dans la MasterPage Navigation est un Telerik Tabstrip, Subnavigation est le menu 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);
    }
}

mise en œuvre XmlSiteMapProvider Cette solution est assez bon pour l'instant, se penchera sur plus tard pour l'embellir:)

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

Autres conseils

Zyphax,

Il est plus probable que vous allez devoir réécrire le TabStrip et commandes de menu pour tenir compte de vos itinéraires. Cela signifie également que vous pouvez supprimer les SiteMapNodes en double.

vous lieu besoin d'écrire du code pour parcourir l'arborescence SiteMap pour obtenir l'ancêtre le plus qui est un enfant de la page d'accueil. Ceci est une méthode d'extension qui pourrait aider.

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

    return node;
}

En utilisant également des URL relatives aidera Présentations ../ au lieu de / projets / pomme / 10 / Présentations

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top