Cómo obtener información de la página del formulario en XMLSiteMapProvider personalizado

StackOverflow https://stackoverflow.com/questions/1803702

Pregunta

Antes que nada, debo decirle que uso la reescritura de URL en este proyecto.

Para la página del artículo, esta es la url: www.mysite.com/section1/section2/month/day/year/modifiedArticleName

Para las migajas de pan, utilizo el control SiteMapPath con un XMLSiteMapProvider personalizado porque no puedo mantener todos mis artículos en el archivo xml. En este proveedor, en la propiedad CurrentNode, si la url es parte de un artículo, creo un nuevo SiteMapNode, lo vinculo al padre apropiado y lo devuelvo.

El problema es que debo proporcionar a ese nodo el nombre del artículo. No puedo obtenerlo de la URL, porque, como se ve anteriormente, la URL utiliza un nombre de artículo modificado. Así que necesito sacarlo de la página.

En la propiedad CurrentNode puedo obtener una instancia de la página actual en ejecución pero, como el artículo está cargado en Page_Load, aún no tengo el título.

Pensé en una solución, pero no estoy seguro de cómo implementarla. Por lo tanto, debería tener 2 XMLSiteMapProvider, el predeterminado y el personalizado. Y use el personalizado solo en la página de mi artículo, inicializándolo solo después de cargar los detalles de mi artículo. ¿Alguien puede indicarme la dirección correcta?

Saludos.

¿Fue útil?

Solución

Logré alcanzar mi objetivo haciendo esto:

En el archivo 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>

Siempre que estoy en una página normal, uso el proveedor predeterminado. Cuando estoy en la página del artículo, hago esto:

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

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

Y finalmente, en la propiedad CurrentNode del proveedor, obtengo el título del artículo:

MyApp.ArticlePage page = (MyApp.ArticlePage)HttpContext.Current.Handler;
                    if (page != null)
                    {
                        if (!string.IsNullOrEmpty(page.Article.Title))
                        {
                            articleName = page.Article.Title;
                        }
                    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top