0

我有一个从数据库加载其基本节点的面包屑(感谢 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 的断点。

4

1 回答 1

1

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

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

此外,所有 DynamicNode 的 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());
于 2013-11-14T01:15:38.970 回答