我使用ASP.NET MVC SiteMap provider创建动态站点地图节点。它在首次加载应用程序时有效,但我希望在ActionResult执行时添加/删除节点(从数据库添加/删除记录)。我的web.sitemap如下(从父节点和其他兄弟节点中取出)
<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;
}
然而,我接着在ActionResult中创建这些节点,但此时陷入困境。我可以抓住节点:
var node = ((MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider).FindSiteMapNodeFromKey("record_edit_" + record.ID);
但是我想检查节点是否为空,如果不是,则创建一个新节点(如果不存在则为父节点)。我尝试的第一件事不起作用,因为不确定你是否可以将DynamicNode添加到站点地图(因为我无法将DynamicNode强制转换为SiteMapNode)
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;
}
当然,由于上述问题,这不起作用。
这仅适用于每条记录的编辑页面,我还想更改标题(如果标题已更改)或必要时从站点地图中删除。
有什么想法吗?
答案 0 :(得分:0)
尝试在动态节点提供程序上设置缓存依赖关系,并在需要时让它们触发站点地图更新(例如,添加记录时)。