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

2019-10-16 16:37发布

我使用的是MVCSitemapProvider我的ASP.NET MVC 3项目,我有一份新闻稿部分动态节点。 我现在面临的问题是,有多个节点的一个部分,当我在现场看地图它的正常工作为这样:

> 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>

当我重写这个quesiton,我一直在玩与周围的代码,没有做任何大的变化和现在...新闻稿#1显示新闻稿#1,新闻发布#2显示新闻稿#3和出版社发布#3是表示新闻稿#1。

我被这个困惑。

Answer 1:

这样做的原因是,站点地图提供者不能你的路由区分。 现在所有的新闻稿都通过相同的URL访问,/新闻/ pressreleases /。 为了使面包屑纠正你应该通过传递像一个id,给供应商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);
}

这种微小的变化会使面包正常工作。



文章来源: MVCSiteMapProvider Dynamic Node always returns the first node for all pages in the breadcrumbs