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/からアクセスしています。ブレッドクラムを正しくするには、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);
}

この小さな変更により、ブレッドクラムは期待どおりに機能します。

于 2012-05-07T08:26:23.977 に答える