MVCSiteMapProvider Dynamic Node always returns the first node for all pages in the breadcrumbs

匿名 (未验证) 提交于 2019-12-03 01:06:02

问题:

I'm using the MVCSitemapProvider for my ASP.NET MVC 3 project, I have a dynamic node for a press release section. The issue I'm facing is that there are multiple nodes for a section and when I look at the site map it's working correctly as so:

> Home   > Static Node - Press Releases     >Dynamic node - Press Release #1     >Dynamic node - Press Release #2     >Dynamic node - Press Release #3 

However in the bread crumbs, if I navigate to the Press Release #2 page. the Breadcrumb will show the first node.

Home > Press Releases > Press Release #1  

Here's the code for the Node Provider

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

and the MVC sitemap code:

<mvcSiteMapNode controller="News" action="PressReleases" title="Press Releases" >   <mvcSiteMapNode controller="News" action="PressRelease" title="" dynamicNodeProvider="MySite.NodeProvider.PressReleaseDynamicNodeProvider, MySite" /> </mvcSiteMapNode> 

As I was rewriting this quesiton, I've been playing around with the code, not making any major changes and NOW... Press Release #1 is showing Press Release #1, Press Release #2 is showing Press Release #3 and Press Release #3 is showing Press Release #1.

I'm baffled by this.

回答1:

The reason for this is that the sitemap provider can't distinguish between your routes. Right now all press releases are accessed through the same URL, /news/pressreleases/. To make the breadcrumbs correct you should pass something like an id, to the provider through node.RouteValues.

For example, your action method PressReleases in NewsControllermay look something like this:

public ActionResult PressReleases(int id) {   ... implementation ... } 

Then you would pass the id parameter into the RouteValues like this:

foreach (var release in releases) {   DynamicNode node = new DynamicNode();   node.Title = release.Title;   node.RouteValues.Add("id", release.Id);   returnValue.Add(node); } 

This small change will make the breadcrumbs work as expected.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!