将动态节点添加到站点地图

时间:2013-11-13 13:29:49

标签: asp.net-mvc-4 mvcsitemapprovider

我有一个从DB加载基本节点的面包屑(thx到nightowl以获得帮助!)。 为了实现这一功能,我实现了一个实现'ISiteMapNodeProvider'的'CustomSiteMapNodeProvider'。面包屑现在适用于来自数据库的节点。 现在我想添加动态节点作为来自数据库的一些节点的子节点。 我的第一个冲动是使用MvcSiteMapNodeAttribute。

[MvcSiteMapNodeAttribute(Title = "Execute", Area = "MyArea", DynamicNodeProvider = "My.Namespace.MyDynamicNodeProvider, My.Assembly", Clickable = false, ParentKey="KeyOfParentDbNode")]
public ActionResult Execute(Guid id, MyViewModel vm){
      return View(vm)
}

但是这不起作用,'MyDynamicNodeProvider'内部的断点在启动时被击中,但是当我调用'Execute'方法时,没有显示痕迹。

以下是我的DynamicNodeProvider的样子:

public class ProfileDynamicNodeProvider
    : DynamicNodeProviderBase
    {
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
        {
            ProfileDao dao = DependencyResolver.Current.GetService<ProfileDao>();

            // Create a node for each element 
            foreach (Profile profile in dao.GetAll())
            {
                DynamicNode dynamicNode = new DynamicNode
                {
                    Title = profile.Name,
                    //Key = "Profile_"+profile.IdProfile,
                    ParentKey = "KeyOfParentNode",
                };
                dynamicNode.RouteValues.Add("id", profile.IdProfile);

                yield return dynamicNode;
            }
        }

    }

我能做些什么来完成这项工作?

编辑:可能是,他们按错误的顺序处理?在到达CustomSiteMapNodeProvider的断点之前,我到达了DynamicNodeProvider的断点。

1 个答案:

答案 0 :(得分:1)

声明DynamicNode的节点只是一个模板节点。该节点不会添加到SiteMap。此外,您在提供程序中的DynamicNode对象上设置的任何属性都将覆盖您在模板节点上定义的内容。

在您的示例中,“KeyOfParentDbNode”值将在每种情况下被值“KeyOfParentNode”覆盖,这可能是您的问题的根源。此外,请确保某处有一个节点将key属性显式设置为“KeyOfParentNode”(即,如果“KeyOfParentNode”是您要设置的内容)。

此外,所有DynamicNodes的Clickable属性都将设置为false。

如果您使用的是4.3.0或更高版本,则顺序无关紧要,因为SiteMapNodeProviders在SiteMapBuilder将它们添加到SiteMap之前实例化所有节点,因此所有父节点在该时间点都可用。

使用@Html.MvcSiteMap().SiteMap() HTML帮助程序查看节点以查看它们是否正确嵌套通常很有帮助。您还可以通过调用MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("TheDynamicNodeKey")来检查控制器和操作(和其他)属性是否正确设置(尽管在您的示例中它应该没问题。)

您可能遇到的另一个问题是MvcSiteMapProvider在进行比较时使用字符串,并且您将“id”设置为Guid。

// You have
dynamicNode.RouteValues.Add("id", profile.IdProfile);

// Should be
dynamicNode.RouteValues.Add("id", profile.IdProfile.ToString());