Domanda

Ho una domanda simile a quello descritto qui:
ASP.NET URL Routing con WebForms - Utilizzando la Mappa del sito

Il mio ASP.Net WebForms webapplication ha una Sitemap, simile a questo:

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

mi piacerebbe avere l'URL nel seguente formato:
: // host / progetti / {azienda} / {} projectno / Casa
: // host / progetti / microsoft / 10 / casa
: // host / progetti / microsoft / 11 / Rapporti
: // host / progetti / mela / 10 / ExtraReports

L'URL di routing percorsi / progetti / {azienda} / {projectno} / {nome pagina} per /Pages/{pagename}.aspx.

La mia navigazione è costituito da un TabStrip sulla parte superiore che dovrebbe contenere casa, rapporti e presentazioni e un menu a sinistra con i loro elementi secondari (ad esempio con selezionato casa dovrebbe essere: di casa, Faq ).

Le mie domande:

  1. Qual è il modo corretto di gestire le URL duplicati SiteMapNode?

  2. Come posso evitare il TabStrip di generare URL del tipo:: // host / Casa e: // host / ExtraReports
    ho bisogno di mantenere la società attuale e projectno selezione, e la mappa del sito ignora URL relativi

  3. Il TabStrip e controlli Menu necessità di riconoscere gli elementi selezionati per mostrare la selezione attiva. Qual è la giusta soluzione a tutto questo?

È stato utile?

Soluzione

Dopo aver trascorso qualche ora su questo, penso che sono venuto a un bene (abbastanza :)) soluzione.

file Sitemap
Avviso i nodi senza url punterà al genitore     

<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 di utilità per generare l'URL
CurrentContext è un riferimento statico al 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;
}

eventi databound nel MasterPage
di navigazione è un Telerik Tabstrip, Subnavigation è il 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);
    }
}

implementazione XmlSiteMapProvider
Questa soluzione è abbastanza buono per ora, cercherà in un secondo momento per rendendolo anche più elegante:)

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

Altri suggerimenti

Zyphax,

E 'più probabile che si sta andando ad avere per riscrivere il TabStrip e controlli dei menu per tenere conto dei tuoi percorsi. Ciò significherebbe anche che è possibile rimuovere i duplicati SiteMapNodes.

Al contrario si avrebbe bisogno di scrivere del codice per attraversare l'albero SiteMap per ottenere l'antenato più lontana, che è un figlio della home page. Questo è un metodo di estensione che potrebbe aiutare.

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

    return node;
}

Anche utilizzando gli URL relativi contribuirà a ../ Presentazioni , anziché / progetti / mela / 10 / Presentazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top