首先,我需要告诉你我在这个项目中使用URL重写。

对于文章页面,这是网址:www.mysite.com/section1/section2/month/day/year/modifiedArticleName

对于面包屑我使用SiteMapPath控件和自定义XMLSiteMapProvider,因为我无法将所有文章保存在xml文件中。在此提供程序中,在CurrentNode属性中,如果url是文章之一,我创建一个新的SiteMapNode,将其链接到相应的父级并返回它。

问题是我需要向该节点提供文章名称。我无法从网址获取它,因为,正如您在上面看到的,网址使用修改过的文章名称。所以我需要从页面上获取它。

在CurrentNode属性中,我能够获取当前运行页面的实例,但是,由于文章是在Page_Load上加载的,我还没有标题。

我想过一个解决方案,但我不确定如何实现它。所以,我应该有2个XMLSiteMapProvider,默认的和自定义的。并且仅在我的文章页面上使用自定义的,仅在我加载文章详细信息后初始化它。有人能指出我正确的方向吗?

干杯。

有帮助吗?

解决方案

我设法通过这样做实现了我的目标:

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

每当我在常规页面上时,我都会使用默认提供程序。当我在文章页面上时,我这样做:

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

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

最后,在提供者的CurrentNode属性中,我得到文章标题:

MyApp.ArticlePage page = (MyApp.ArticlePage)HttpContext.Current.Handler;
                    if (page != null)
                    {
                        if (!string.IsNullOrEmpty(page.Article.Title))
                        {
                            articleName = page.Article.Title;
                        }
                    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top