嵌套级别上的重复动态节点

Duplicate dynamic nodes on nested levels

我对 MVCSiteMapProvider 有如下问题。

我的MVC.siteMap:

<mvcSiteMapNode title="Home" controller="Home" action="Index" key="home">
    <mvcSiteMapNode title="Login/Register" controller="Login" action="Index"/>

    <mvcSiteMapNode title="Collections" clickable="false" key="nodeCollections">
        <mvcSiteMapNode title="Dynamic Nodes" controller="Collections" action="Index" clickable="true" dynamicNodeProvider="mysite.Utilities.DynamicNodeProvider, mysite.com" />
    </mvcSiteMapNode>

    <mvcSiteMapNode title="Categories" clickable="false" key="nodeCategories">
        <mvcSiteMapNode title="Dynamic Nodes" controller="Products" action="Index" clickable="true" dynamicNodeProvider="mysite.Utilities.DynamicNodeProvider, mysite.com" />
    </mvcSiteMapNode>
</mvcSiteMapNode>

我的 DynamicNodeProvider:

        foreach (var collection in collections)
        {
            var node = new DynamicNode
            {
                Title = collection.collection,
                Controller = "Collections",
                Action = "Index",
                ParentKey = "home",
                ChangeFrequency = ChangeFrequency.Weekly
            };
            node.RouteValues.Add("seocollection", collection.seoCollection);
            yield return node;
        }

        ////Get Categories Nodes
        // Create a node for each category 
        foreach (var category in categories)
        {
            var node = new DynamicNode
            {
                //Key = category.category,
                Title = category.category,
                Controller = "Products",
                Action = "Index",
                ParentKey = "home",
                ChangeFrequency = ChangeFrequency.Weekly
            };
            node.RouteValues.Add("seocategory", category.seocategory);
            yield return node2;
        }

还有我的 HtmlHelper:

<div style="text-align: center;">
    @Html.MvcSiteMap().Menu("MenuHelperModel", SiteMaps.Current.FindSiteMapNodeFromKey("home"),true,true)
</div>

虽然这工作正常,但我在返回的菜单上得到了重复的结果,即它显示:

主页
Login/Register
Collection秒
Collection一个
A 类
B 类
类别
Collection一个
A 类
B类

我在 MVC.sitemap 中绑定不正确吗?

Am I binding incorrectly in the MVC.sitemap?

是的。您得到重复的结果,因为您注册了相同的动态节点提供程序 2 次。此外,您已指定将每个节点嵌套在主节点下方,这将为您提供平面结构。

首先,要解决嵌套问题,您应该为每个嵌套项目指定一个不同于 "home" 的父键。根据您构建 XML 的方式,我猜您不希望它们位于 "home" 节点下。

    foreach (var collection in collections)
    {
        var node = new DynamicNode
        {
            Title = collection.collection,
            Controller = "Collections",
            Action = "Index",
            // Specify the node you want this node nested under
            ParentKey = "nodeCollections", 
            ChangeFrequency = ChangeFrequency.Weekly
        };
        node.RouteValues.Add("seocollection", collection.seoCollection);
        yield return node;
    }

    ////Get Categories Nodes
    // Create a node for each category 
    foreach (var category in categories)
    {
        var node = new DynamicNode
        {
            //Key = category.category,
            Title = category.category,
            Controller = "Products",
            Action = "Index",
            // Specify the node you want this node nested under
            ParentKey = "nodeCategories",
            ChangeFrequency = ChangeFrequency.Weekly
        };
        node.RouteValues.Add("seocategory", category.seocategory);
        yield return node2;
    }

然后,要解决重复问题,您需要将 1 个动态节点分成 2 个,或者只需在 XML 中仅指定一次。请注意,声明动态节点提供程序的位置并不重要 - 父键是将所有节点放置在节点层次结构中适当位置的原因。

<mvcSiteMapNode title="Home" controller="Home" action="Index" key="home">
    <mvcSiteMapNode title="Login/Register" controller="Login" action="Index"/>
    <mvcSiteMapNode title="Collections" clickable="false" key="nodeCollections"/>
    <mvcSiteMapNode title="Categories" clickable="false" key="nodeCategories"/>
    <mvcSiteMapNode dynamicNodeProvider="mysite.Utilities.DynamicNodeProvider, mysite.com" />
</mvcSiteMapNode>

您在 XML 中指定的值将成为动态节点提供程序中的 默认值 值。如果它们已经在动态节点提供程序中指定,则它们不是绝对必要的。

另请注意,如果将 1 个动态节点提供程序拆分为 2 个,则使用起来会比此示例更直观,但从技术角度来看,这不是必需的。