我有一个从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的断点。
答案 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());