1

我正在为我的 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 页面。面包屑将显示第一个节点。

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。

我对此感到困惑。

4

1 回答 1

2

原因是站点地图提供商无法区分您的路线。目前,所有新闻稿都通过相同的 URL /news/pressreleases/ 访问。为了使面包屑正确,您应该通过node.RouteValues.

例如,您的操作方法可能如下所示PressReleasesNewsController

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

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

于 2012-05-07T08:26:23.977 回答