0

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

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

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

问题是我需要向该节点提供文章名称。我无法从 url 中得到它,因为就像你在上面看到的那样,url 使用了修改后的文章名称。所以我需要从页面中获取它。

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

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

干杯。

4

1 回答 1

0

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

在 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;
                        }
                    }
于 2009-11-27T07:39:20.010 回答