在 mvc5 中使用 MvcSiteMap 创建面包屑

本文关键字:创建 面包 MvcSiteMap mvc5 | 更新日期: 2023-09-27 18:31:41

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

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

在 mvc5 中使用 MvcSiteMap 创建面包屑

如文档中所述,您必须显式配置所有自定义路由参数(包括 id)。您可以通过在 Preserve RouteParameters 中包含键来创建与操作方法的 1 对 1 关系,也可以通过为每个路由值组合创建单独的节点来创建与操作的一对多关系。

1

对1关系

使用 XML:

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

或使用 .NET 属性:

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

注意:使用此方法时,网址只能在 SiteMapPath HTML 帮助程序中正确解析,您可能需要手动修复节点的标题和可见性,如此处所述。

一对多关系

使用 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 属性:

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

或使用动态节点提供程序:

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