首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改父密钥- IDynamicNodeProvider MVC

动态更改父密钥- IDynamicNodeProvider MVC
EN

Stack Overflow用户
提问于 2016-03-01 07:45:44
回答 1查看 497关注 0票数 1

我根据这个IDynamicNodeProvider实现https://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider

我想动态地更改父键。根据我的菜单导航,我有很多父节点。一些例子是

代码语言:javascript
复制
1) Home>Profile>Quality Policy
2) Home>eServices>eService 

我有两张桌子。在第一个,我保留我的菜单。MenuID,MenuTitle,还有另一个,我存储我的内容。ArticleID,ArticleTitle,ArticleContent,MenuID。

我需要动态地更改父密钥。

这是我的课

代码语言:javascript
复制
      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;
        }


    }

我的站点地图文件

代码语言:javascript
复制
<mvcSiteMapNode title="Home" controller="Home" action="Index">

 <mvcSiteMapNode  controller="SiteContents"   dynamicNodeProvider="Myproject.Models.ElkeDynamicNodeProvider, Myproject"  />
 </mvcSiteMapNode>

我如何加入这两个表,以便将MenuTitle作为一个parentKey,以及如何在正确的操作中链接这个表。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 16:03:47

每个节点不可能有多个父节点,也不可能动态更改父键。

我不知道你到底想通过这个实现什么,但请注意,通过向该页面提供两个唯一的URL并在其中一个页面上使用canonicalKeycanonicalUrl来防止搜索引擎惩罚您是有可能的。

还请注意,实际上可以使用数据库中主键和/或外键的变体来创建节点。因此,如果数据库中有这种关系,则可以根据相同的关系创建动态节点。

例如,如果您的MenuID表中有一个Article表(或者可以加入这些表以获得相应的MenuID ),则只需循环遍历每个表并创建一个基于MenuID (例如MenuID1234)的键,该键用于菜单实体的键和项目实体的父键。然后,每一篇文章都有一个键ArticleID3456,它可以用作下一个级别的父键。

示例

代码语言:javascript
复制
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;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35717293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档