【问题标题】:change parent Key dynamically - IDynamicNodeProvider MVC动态更改父键 - IDynamicNodeProvider MVC
【发布时间】:2016-03-01 07:45:44
【问题描述】:

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

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

1) Home>Profile>Quality Policy
2) Home>eServices>eService 

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

我需要动态更改父键。

这是我的课

      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,以及如何在正确的操作中链接。 谢谢

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    每个节点不能有多个父节点或动态更改父键。

    我不确定您到底想通过这个实现什么,但请注意,可以通过为该页面提供 2 个唯一 URL 并在其中一个上使用 canonicalKeycanonicalUrl 来获得 multiple navigation paths to a page以防止搜索引擎惩罚您。

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

    例如,如果您的Article 表中有一个MenuID(或者可以加入这些表以获得相应的MenuID,您只需遍历每个表并根据@987654327 创建一个键@(如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;
            }
        }
    }
    

    【讨论】:

    • 我想要实现的是 Home>profile> article1 和 Home>eservices>article2。我的意思是我必须更改父 Key 节点。它基于我的手风琴菜单。
    • profileeservicesMenuTitle 字段中也是如此吗?一篇文章可以属于多个Menu吗?
    • 1) 是的,他们在这个领域。 2) 没有,目前每个菜单都与一篇独特的文章相关。
    • 我在第一次 foreach 时收到以下错误:“执行命令定义时发生错误。有关详细信息,请参阅内部异常。”详细地说是“无效的对象名称'dbo.SiteMenus'”。这是我的桌子。
    • 其实我的表名是 SiteMenu 和我的模型同名。但是当我更改它时,它会带来:“ProjectName.Models.webdata”不包含“SiteMenu”的定义,并且找不到接受“ProjectName.Models.webdata”类型的第一个参数的扩展方法“SiteMenu”(是您缺少 using 指令或程序集引用?)。我试图重建但没有。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多