Domanda

Prima di tutto devo dirti che utilizzo la riscrittura degli URL su questo progetto.

Per la pagina dell'articolo questo è l'URL: www.mysite.com/section1/section2/month/day/year/modifiedArticleName

Per breadcrumb, utilizzo il controllo SiteMapPath con un XMLSiteMapProvider personalizzato perché non riesco a conservare tutti i miei articoli nel file xml. In questo provider, nella proprietà CurrentNode, se l'URL è uno di un articolo, creo un nuovo SiteMapNode, lo collego al genitore appropriato e lo restituisco.

Il problema è che devo fornire a quel nodo il nome dell'articolo. Non riesco a ottenerlo dall'URL, perché, come vedi sopra, l'URL utilizza un nome articolo modificato. Quindi ho bisogno di prenderlo dalla pagina.

Nella proprietà CurrentNode sono in grado di ottenere un'istanza della pagina corrente corrente ma, poiché l'articolo è caricato su Page_Load, non ho ancora il titolo.

Ho pensato a una soluzione ma non sono sicuro di come implementarla. Quindi, dovrei avere 2 XMLSiteMapProvider, quello predefinito e il mio personalizzato. E usa quello personalizzato solo sulla pagina del mio articolo, inizializzandolo solo dopo aver caricato i dettagli del mio articolo. Qualcuno può indicarmi la giusta direzione?

Saluti.

È stato utile?

Soluzione

Sono riuscito a raggiungere il mio obiettivo facendo questo:

Nel file web.config:

<siteMap defaultProvider="RegularXMLSiteMapProvider">
  <providers>
    <add name="RegularXMLSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/Web.sitemap" />
    <add name="EnhancedXMLSiteMapProvider" type="MyApp.App_Code.EnhancedXMLSiteMapProvider, MyApp" siteMapFile="~/Web.sitemap"/>
  </providers>
</siteMap>

Ogni volta che mi trovo su una pagina normale, utilizzo il provider predefinito. Quando sono sulla pagina dell'articolo, faccio questo:

protected void Page_Load(object sender, EventArgs e)
    {
        LoadArticle();

        MasterPages.MyMasterPage myMaster = (MasterPages. MyMasterPage)this.Master;
        myMaster.MySiteMapPath.SiteMapProvider = "EnhancedXMLSiteMapProvider"; 
    }

E infine, nella proprietà CurrentNode del provider ottengo il titolo dell'articolo:

MyApp.ArticlePage page = (MyApp.ArticlePage)HttpContext.Current.Handler;
                    if (page != null)
                    {
                        if (!string.IsNullOrEmpty(page.Article.Title))
                        {
                            articleName = page.Article.Title;
                        }
                    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top