Asp.net mvc 2 在ActionResult-ASP.NET MVC站点地图提供程序中创建/删除站点地图节点

Asp.net mvc 2 在ActionResult-ASP.NET MVC站点地图提供程序中创建/删除站点地图节点,asp.net-mvc-2,sitemap,mvcsitemapprovider,Asp.net Mvc 2,Sitemap,Mvcsitemapprovider,我正在使用创建动态站点地图节点。它在第一次加载应用程序时工作,但我希望在执行ActionResult时添加/删除节点(从数据库中添加/删除记录)。My web.sitemap如下(去掉父节点和其他同级节点) 但接下来我想检查节点是否为null,如果不是,则创建一个新节点(如果不存在,则创建父节点)。我尝试的第一件事不起作用,因为不确定是否可以向站点地图添加DynamicNode(因为我无法将DynamicNode强制转换为SiteMapNode) 当然,由于上述问题,这不起作用 这只是针对每个记

我正在使用创建动态站点地图节点。它在第一次加载应用程序时工作,但我希望在执行ActionResult时添加/删除节点(从数据库中添加/删除记录)。My web.sitemap如下(去掉父节点和其他同级节点)

但接下来我想检查节点是否为null,如果不是,则创建一个新节点(如果不存在,则创建父节点)。我尝试的第一件事不起作用,因为不确定是否可以向站点地图添加DynamicNode(因为我无法将DynamicNode强制转换为SiteMapNode)

当然,由于上述问题,这不起作用

这只是针对每个记录的编辑页面,我还希望更改标题(如果标题已更改)或在必要时从站点地图中删除


有什么想法吗?

尝试在动态节点提供程序上设置缓存依赖项,并在需要时(例如添加记录时)让它们触发站点地图更新。

如何使用CacheDescription设置依赖项?我不想重建动态节点提供程序设置的所有节点(因为它会定期进行),只重建已更改的记录和父节点(如果不存在)。没有一个动态节点提供程序示例(在MvcMusicStore中)显示如何使用其他CacheDescription选项不幸的是,这将触发完全重建。CacheDescription可以是时间跨度、显式到期日期或CacheDependency。我在一些项目中使用最后一个。()
<mvcSiteMapNode dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DatesDynamicNodeProvider, MyWebSite">
    <mvcSiteMapNode action="Details" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DetailsDynamicNodeProvider, MyWebSite" />
    <mvcSiteMapNode action="Edit" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.EditDynamicNodeProvider, MyWebSite" />
    <mvcSiteMapNode action="Delete" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DeleteDynamicNodeProvider, MyWebSite" />
</mvcSiteMapNode>
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        DBDataContext db = new DBDataContext();

        var records = db.records.ToList();
        if (records != null)
        {
            DateTime created;
            foreach (var record in records)
            {
                if (record.DateCreated.HasValue)
                {
                    created = record.DateCreated.Value;
                    DynamicNode node = CreateNode(created);
                    yield return node;
                }

            }
        }
    }

    public static DynamicNode CreateNode(DateTime date)
    {
        DynamicNode node = new DynamicNode("record_" + date.ToString("yyyy-M"), date.ToString("MMMM yyyy"));
        node.Action = date.ToString("yyyy-M");
        node.ParentKey = "records";
        return node;
    }
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        DBDataContext db = new DBDataContext();

        var records = db.records.ToList();
        if (records != null)
        {
            // Create a node for each record
            foreach (var record in records)
            {
                if (record.DateCreated.HasValue)
                {
                    DynamicNode node = CreateNode(record);

                    yield return node;
                }
            }
        }
    }

    public static DynamicNode CreateNode(Record record)
    {
        DateTime created = record.DateCreated.Value;
        DynamicNode node = new DynamicNode("record_edit_" + record.ID, string.Format("{0:dd MMM yyyy}: {1} (Edit)", created, record.Title));
        node.RouteValues["id"] = record.ID;
        node.ParentKey = "record_" + created.ToString("yyyy-M");

        return node;
    }
var node = ((MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider).FindSiteMapNodeFromKey("record_edit_" + record.ID);
    if (node == null)
    {
        node = DynamicNodeProvider.EditDynamicNodeProvider.CreateNode(record) as SiteMapNode;
        var parent = ((MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider).FindSiteMapNodeFromKey("record_" + record.DateCreated.Value.ToString("yyyy-M"));
        if (parent == null)
        {
            parent = DynamicNodeProvider.DatesDynamicNodeProvider.CreateNode(record.DateCreated.Value) as SiteMapNode;
            parent.Action = record.DateCreated.Value.ToString("yyyy-M");
            parent.ParentKey = "records";
        }
        node.ParentKey = parent.ParentKey;
    }