Asp.net mvc 4 向站点地图添加动态节点
我有一个breadcrumb,它从DB加载它的基本节点(thx to nightowl以获取帮助!)。 为了归档此功能,我实现了一个“CustomSiteMapNodeProvider”,它实现了“IsItemApodeProvider”。面包屑现在适用于来自数据库的节点。 现在我想添加动态节点作为来自DB的一些节点的子节点。 我的第一个冲动是使用mvcsitemanode属性Asp.net mvc 4 向站点地图添加动态节点,asp.net-mvc-4,mvcsitemapprovider,Asp.net Mvc 4,Mvcsitemapprovider,我有一个breadcrumb,它从DB加载它的基本节点(thx to nightowl以获取帮助!)。 为了归档此功能,我实现了一个“CustomSiteMapNodeProvider”,它实现了“IsItemApodeProvider”。面包屑现在适用于来自数据库的节点。 现在我想添加动态节点作为来自DB的一些节点的子节点。 我的第一个冲动是使用mvcsitemanode属性 [MvcSiteMapNodeAttribute(Title = "Execute", Area = "MyArea"
[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)
}
但这不起作用,“mydynamicondeprovider”中的断点在启动时被击中,但是当我调用“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;
}
}
}
public类profiledynamicondeprovider
:dynamicodeProviderBase
{
公共重写IEnumerable GetDynamicNodeCollection(ISiteMapNode节点)
{
ProfileDao=DependencyResolver.Current.GetService();
//为每个元素创建一个节点
foreach(dao.GetAll()中的概要文件)
{
DynamicNode DynamicNode=新的DynamicNode
{
Title=profile.Name,
//Key=“Profile”+Profile.IdProfile,
ParentKey=“KeyOfParentNode”,
};
添加(“id”,profile.IdProfile);
收益动态模型;
}
}
}
我能做些什么来让它工作
编辑:可能是因为它们的处理顺序不对吗?在到达CustomSiteMapNodeProvider的断点之前,我到达了DynamicNodeProvider的断点。声明DynamicNode的节点只是一个模板节点。该节点将不会添加到站点地图。此外,您在提供程序中的DynamicNode对象上设置的任何属性都将覆盖您在模板节点上定义的属性 在您的示例中,“KeyOfParentDbNode”值在任何情况下都会被“KeyOfParentNode”值覆盖,这可能是问题的根源。另外,请确保某个节点将key属性显式设置为“KeyOfParentNode”(也就是说,如果“KeyOfParentNode”是您想要设置的) 此外,所有DynamicNodes的Clickable属性都将设置为false 如果您使用的是4.3.0或更高版本,则顺序无关紧要,因为SiteMapNodeProviders会在SiteMapBuilder将所有节点添加到站点地图之前实例化所有节点,以便所有父节点在该时间点都可用 使用
@Html.MvcSiteMap().SiteMap()
Html帮助程序查看节点是否正确嵌套通常很有用。您还可以通过调用mvcsitemprovider.SiteMaps.Current.findsitemsapnodefromkey(“TheDynamicNodeKey”)
来检查控制器和操作(以及其他)属性是否设置正确(尽管在您的示例中应该可以)
您可能遇到的另一个问题是,MvcSiteMapProvider在进行比较时使用字符串,并且您正在将“id”设置为Guid
// You have
dynamicNode.RouteValues.Add("id", profile.IdProfile);
// Should be
dynamicNode.RouteValues.Add("id", profile.IdProfile.ToString());
thx,网站地图的提示引导我朝着正确的方向前进!现在一切都正常了。我又遇到了一个小问题:当我添加一个概要文件时,新创建的实例当然没有breadcrumb节点(因为节点是在应用程序开始时创建的,而新实例还不存在)。有没有重新获取节点的方法?用SiteMapCacheReleaseAttribute修饰添加/更新/删除配置文件的方法-先生,你太棒了