嵌套级别上的重复动态节点
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 个,则使用起来会比此示例更直观,但从技术角度来看,这不是必需的。
我对 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 个,则使用起来会比此示例更直观,但从技术角度来看,这不是必需的。