动态更改 parent 键 - IDynamicNodeProvider MVC
change parent Key dynamically - IDynamicNodeProvider MVC
我按照这个实现IDynamicNodeProviderhttps://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider
我想动态更改 parent 密钥。根据我的菜单导航,我有很多 parent 个节点。
一些例子是
1) Home>Profile>Quality Policy
2) Home>eServices>eService
我有两张桌子。在第一个中,我保留菜单。 MenuID、MenuTitle 和另一个我存储我的内容。文章 ID、文章标题、文章内容、菜单 ID。
我需要动态更改 parent 密钥。
这是我的class
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
webdata storeDB = new webdata();
var returnValue = new List<DynamicNode>();
foreach (var article in storeDB.SiteContents)
{
DynamicNode enode = new DynamicNode();
enode.Title = article.ArticleTitle;
enode.ParentKey = "?";
//Specify Controller and Action name
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", article.ArticleID);
enode.PreservedRouteParameters.Add("slug");
returnValue.Add(enode);
yield return enode;
}
}
我的站点地图文件
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode controller="SiteContents" dynamicNodeProvider="Myproject.Models.ElkeDynamicNodeProvider, Myproject" />
</mvcSiteMapNode>
我如何连接这两个表以便将 MenuTitle 作为 parentKey 以及如何在正确的操作中将其链接起来。
谢谢
每个节点不能有多个父节点或动态更改父键。
我不确定你到底想通过这个实现什么,但请注意,可以通过为该页面提供 2 个唯一的 URL 并使用 canonicalKey
或 [来获得 multiple navigation paths to a page =12=] 在其中之一上,以防止搜索引擎惩罚您。
另请注意,您实际上可以使用数据库中主 and/or 外键的变体来创建节点。因此,如果您的数据库中有这种关系,您可以根据相同的关系创建动态节点。
例如,如果您的 Article
table 中有一个 MenuID
(或者可以加入 table 以获得相应的 MenuID
,您只需要遍历每个 table 并基于 MenuID
(例如 MenuID1234
)创建一个键,该键用于菜单实体的键和文章的父键实体。每篇文章都会有一个键ArticleID3456
,可以作为下一级的父键。
例子
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
// I am assuming here that webdata is your
// Entity Framework context class. If so,
// you should wrap it in a using block.
using (webdata storeDB = new webdata())
{
// Loop through your Menu Table
foreach (var menuItem in storeDB.Menu)
{
DynamicNode enode = new DynamicNode();
enode.Title = menuItem.MenuTitle;
// I am assuming that you want your menu categories below the home page
// and that that node has a key="Home" attribute set.
enode.ParentKey = "Home";
// Specify the key based on the primary key in the DB
// Cast to a string if necessary.
enode.Key = "MenuID" + menuItem.MenuID;
// Specify Controller and Action name
// (not sure where you want to navigate to here)
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", menuItem.MenuID);
// If your menu categories don't represent
// real pages, you can use non-clickable nodes
// instead of controller, action, and id.
//enode.Clickable = false;
// Add this if you use a slug on these pages
enode.PreservedRouteParameters.Add("slug");
yield return enode;
}
// Loop through your Article Table
foreach (var article in storeDB.Article)
{
DynamicNode enode = new DynamicNode();
enode.Title = article.ArticleTitle;
// Attach to your foreign key, the same way as in your DB
enode.ParentKey = "MenuID" + article.MenuID;
// Give your article a sensible unique key.
// This will save some memory and make it easy
// to add a level below the article if needed.
enode.Key = "ArticleID" + article.ArticleID;
//Specify Controller and Action name
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", article.ArticleID);
enode.PreservedRouteParameters.Add("slug");
yield return enode;
}
}
}
我按照这个实现IDynamicNodeProviderhttps://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider
我想动态更改 parent 密钥。根据我的菜单导航,我有很多 parent 个节点。 一些例子是
1) Home>Profile>Quality Policy
2) Home>eServices>eService
我有两张桌子。在第一个中,我保留菜单。 MenuID、MenuTitle 和另一个我存储我的内容。文章 ID、文章标题、文章内容、菜单 ID。
我需要动态更改 parent 密钥。
这是我的class
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
webdata storeDB = new webdata();
var returnValue = new List<DynamicNode>();
foreach (var article in storeDB.SiteContents)
{
DynamicNode enode = new DynamicNode();
enode.Title = article.ArticleTitle;
enode.ParentKey = "?";
//Specify Controller and Action name
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", article.ArticleID);
enode.PreservedRouteParameters.Add("slug");
returnValue.Add(enode);
yield return enode;
}
}
我的站点地图文件
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode controller="SiteContents" dynamicNodeProvider="Myproject.Models.ElkeDynamicNodeProvider, Myproject" />
</mvcSiteMapNode>
我如何连接这两个表以便将 MenuTitle 作为 parentKey 以及如何在正确的操作中将其链接起来。 谢谢
每个节点不能有多个父节点或动态更改父键。
我不确定你到底想通过这个实现什么,但请注意,可以通过为该页面提供 2 个唯一的 URL 并使用 canonicalKey
或 [来获得 multiple navigation paths to a page =12=] 在其中之一上,以防止搜索引擎惩罚您。
另请注意,您实际上可以使用数据库中主 and/or 外键的变体来创建节点。因此,如果您的数据库中有这种关系,您可以根据相同的关系创建动态节点。
例如,如果您的 Article
table 中有一个 MenuID
(或者可以加入 table 以获得相应的 MenuID
,您只需要遍历每个 table 并基于 MenuID
(例如 MenuID1234
)创建一个键,该键用于菜单实体的键和文章的父键实体。每篇文章都会有一个键ArticleID3456
,可以作为下一级的父键。
例子
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
// I am assuming here that webdata is your
// Entity Framework context class. If so,
// you should wrap it in a using block.
using (webdata storeDB = new webdata())
{
// Loop through your Menu Table
foreach (var menuItem in storeDB.Menu)
{
DynamicNode enode = new DynamicNode();
enode.Title = menuItem.MenuTitle;
// I am assuming that you want your menu categories below the home page
// and that that node has a key="Home" attribute set.
enode.ParentKey = "Home";
// Specify the key based on the primary key in the DB
// Cast to a string if necessary.
enode.Key = "MenuID" + menuItem.MenuID;
// Specify Controller and Action name
// (not sure where you want to navigate to here)
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", menuItem.MenuID);
// If your menu categories don't represent
// real pages, you can use non-clickable nodes
// instead of controller, action, and id.
//enode.Clickable = false;
// Add this if you use a slug on these pages
enode.PreservedRouteParameters.Add("slug");
yield return enode;
}
// Loop through your Article Table
foreach (var article in storeDB.Article)
{
DynamicNode enode = new DynamicNode();
enode.Title = article.ArticleTitle;
// Attach to your foreign key, the same way as in your DB
enode.ParentKey = "MenuID" + article.MenuID;
// Give your article a sensible unique key.
// This will save some memory and make it easy
// to add a level below the article if needed.
enode.Key = "ArticleID" + article.ArticleID;
//Specify Controller and Action name
enode.Controller = "SiteContents";
enode.Action = "ArticleDetails";
enode.RouteValues.Add("id", article.ArticleID);
enode.PreservedRouteParameters.Add("slug");
yield return enode;
}
}
}