Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 向站点地图添加动态节点_Asp.net Mvc 4_Mvcsitemapprovider - Fatal编程技术网

Asp.net mvc 4 向站点地图添加动态节点

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"

我有一个breadcrumb,它从DB加载它的基本节点(thx to nightowl以获取帮助!)。 为了归档此功能,我实现了一个“CustomSiteMapNodeProvider”,它实现了“IsItemApodeProvider”。面包屑现在适用于来自数据库的节点。 现在我想添加动态节点作为来自DB的一些节点的子节点。 我的第一个冲动是使用mvcsitemanode属性

[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修饰添加/更新/删除配置文件的方法-先生,你太棒了