2014-11-22 125 views
0

我想用mvc5中的MvcSiteMap创建breadcrumb。 我写下面的代码。 但我想当我点击第一,第二,...他们的ID传递到视图。 但它不起作用。我做对了吗?用mvc5在MvcSiteMap中创建breadcrumb

//Controller Name=News 

Home 
News 
    first  //id=1 
    second //id=2 
    third // id=3 
About 


<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
<mvcSiteMapNode title="News" controller="News" action="Index" key="News"> 
</mvcSiteMapNode> 
<mvcSiteMapNode title="About" controller="About" action="Index"/> 

[MvcSiteMapNode(Title = "News", ParentKey = "News")] 
    public ActionResult News(int id) 
    { 
     ViewBag.id = id; 
     return View(); 
    } 

回答

2

正如the documentation说,你必须配置所有自定义路由参数(包括ID)明确。您可以通过将关键字包含在PreservedRouteParameters中来创建与操作方法的1对1关系,或者可以通过为每个路由值组合创建一个单独的节点,从而与该操作创建一对多关系。

1对1的关系

使用XML

<mvcSiteMapNode title="News" controller="News" action="News" preservedRouteParameters="id"/> 

或使用.NET Attributes

[MvcSiteMapNode(Title = "News", ParentKey = "News", PreservedRouteParameters = "id")] 
public ActionResult News(int id) 
{ 
    ViewBag.id = id; 
    return View(); 
} 

注:使用此方法时,网址只能解决正确地在SiteMapPath HTML助手中,并且您可能需要手动修复节点的标题和可见性,如explained here

1一对多的关系

使用XML

<mvcSiteMapNode title="Article 1" controller="News" action="News" id="1"/> 
<mvcSiteMapNode title="Article 2" controller="News" action="News" id="2"/> 
<mvcSiteMapNode title="Article 3" controller="News" action="News" id="3"/> 

或使用.NET Attributes

[MvcSiteMapNode(Title = "Article 1", ParentKey = "News", Attributes = @"{ ""id"": 1 }")] 
[MvcSiteMapNode(Title = "Article 2", ParentKey = "News", Attributes = @"{ ""id"": 2 }")] 
[MvcSiteMapNode(Title = "Article 3", ParentKey = "News", Attributes = @"{ ""id"": 3 }")] 
public ActionResult News(int id) 
{ 
    ViewBag.id = id; 
    return View(); 
} 

或使用Dynamic Node Provider

随着XML定义节点:

<mvcSiteMapNode title="News" controller="News" action="Index" key="News"> 
    // Setup definition node in XML (won't be in the SiteMap) 
    // Any attributes you put here will be the defaults in the dynamic node provider, but can be overridden there. 
    <mvcSiteMapNode dynamicNodeProvider="MyNamespace.NewsDynamicNodeProvider, MyAssembly" controller="News" action="News"/> 
</mvcSiteMapNode> 

,或者在.NET定义节点属性:

// Setup definition node as a .NET Attribute (won't be in the SiteMap) 
// Any properties you put here will be the defaults in the dynamic node provider, but can be overridden there. 
[MvcSiteMapNode(DynamicNodeProvider = "MyNamespace.NewsDynamicNodeProvider, MyAssembly")] 
public ActionResult News(int id) 
{ 
    ViewBag.id = id; 
    return View(); 
} 

动态节点提供程序实现(对于上述2个定义节点的所需):

public class NewsDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     using (var db = new EnityContext()) 
     { 
      // Create a node for each news article 
      foreach (var news in db.News) 
      { 
       var dynamicNode = new DynamicNode(); 
       dynamicNode.Title = news.Title; 
       dynamicNode.ParentKey = "News"; 
       dynamicNode.RouteValues.Add("id", news.Id); 

       yield return dynamicNode; 
      } 
     } 
    } 
}