MVCSiteMapProvider动态节点始终返回面包屑中所有页面的第一个节点

时间:2012-05-04 20:56:11

标签: asp.net-mvc razor mvcsitemapprovider asp.net-mvc-sitemap

我正在为我的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。

我对此感到困惑。

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);
}

这一小改动将使面包屑按预期工作。