我正在为我的ASP.NET MVC 3项目使用MVCSitemapProvider,我有一个动态节点用于新闻发布部分。我面临的问题是一个部分有多个节点,当我查看站点地图时,它正常工作:
> Home
> Static Node - Press Releases
>Dynamic node - Press Release #1
>Dynamic node - Press Release #2
>Dynamic node - Press Release #3
然而,在面包屑中,如果我导航到新闻稿#2页面。 Breadcrumb将显示第一个节点。
Home > Press Releases > Press Release #1
以下是节点提供程序的代码
public class PressReleaseDynamicNodeProvider : DynamicNodeProviderBase {
public PressReleasesRepository _repository = new PressReleasesRepository();
public List<PressRelease> releases = new List<PressRelease>();
public override IEnumerable<DynamicNode> GetDynamicNodeCollection() {
releases = _repository.GetPressReleases();
var returnValue = new List<DynamicNode>();
foreach (var release in releases) {
DynamicNode node = new DynamicNode();
node.Title = release.Title;
returnValue.Add(node);
}
return returnValue;
}
}
和MVC站点地图代码:
<mvcSiteMapNode controller="News" action="PressReleases" title="Press Releases" >
<mvcSiteMapNode controller="News" action="PressRelease" title="" dynamicNodeProvider="MySite.NodeProvider.PressReleaseDynamicNodeProvider, MySite" />
</mvcSiteMapNode>
当我改写这个问题时,我一直在玩代码,没有做出任何重大改变,现在......新闻稿#1正在显示新闻稿#1,新闻稿#2正在显示新闻稿# 3和新闻稿#3显示新闻稿#1。
我对此感到困惑。
答案 0 :(得分:2)
原因是站点地图提供商无法区分您的路线。现在所有新闻稿都通过相同的URL,/ news / pressreleases /访问。为了使面包屑正确,您应该通过node.RouteValues
将类似ID的内容传递给提供者。
例如,PressReleases
中的操作方法NewsController
可能如下所示:
public ActionResult PressReleases(int id) {
... implementation ...
}
然后你会将id
参数传递给RouteValues
,如下所示:
foreach (var release in releases) {
DynamicNode node = new DynamicNode();
node.Title = release.Title;
node.RouteValues.Add("id", release.Id);
returnValue.Add(node);
}
这一小改动将使面包屑按预期工作。