首先,我需要告诉你我在这个项目中使用URL重写。
对于文章页面,这是网址:www.mysite.com/section1/section2/month/day/year/modifiedArticleName
对于面包屑我使用SiteMapPath控件和自定义XMLSiteMapProvider,因为我无法将所有文章保存在xml文件中。在此提供程序中,在CurrentNode属性中,如果url是文章之一,我创建一个新的SiteMapNode,将其链接到相应的父级并返回它。
问题是我需要向该节点提供文章名称。我无法从网址获取它,因为,正如您在上面看到的,网址使用修改过的文章名称。所以我需要从页面上获取它。
在CurrentNode属性中,我能够获取当前运行页面的实例,但是,由于文章是在Page_Load上加载的,我还没有标题。
我想过一个解决方案,但我不确定如何实现它。所以,我应该有2个XMLSiteMapProvider,默认的和自定义的。并且仅在我的文章页面上使用自定义的,仅在我加载文章详细信息后初始化它。有人能指出我正确的方向吗?
干杯。
答案 0 :(得分: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;
}
}