有没有办法在运行时修改站点地图节点属性?

时间:2014-07-20 21:29:42

标签: c# asp.net-mvc-5 sitemap mvcsitemapprovider

我想知道在应用程序运行时是否有办法更改站点地图的内容并相应地自动更新应用程序?

示例:我想更改特定节点的URL。

我正在使用 MVC SiteMap Provider ,但是只要它与站点地图有关,您使用的提供商可能并不重要。

1 个答案:

答案 0 :(得分:1)

某些属性在运行时是可写请求的。这意味着您可以为当前请求更新它们,但该值不会从一个请求延续到下一个请求。这些属性是(截至v4.6.7):

  • 顺序
  • 标题
  • 描述
  • TargetFrame
  • 的ImageUrl
  • ImageUrlProtocol
  • ImageUrlHostName
  • VisibilityProvider
  • 可点击
  • UrlResolver
  • 协议
  • 主机名
  • CANONICALURL
  • CanonicalKey
  • CanonicalUrlProtocol
  • CanonicalUrlHostName
  • 路线
  • 属性
  • RouteValues

您可以通过调用其中一个“find”方法(或使用当前节点属性)来获取对节点的引用,然后直接更新属性来编写这些值。

var currentNode = MvcSiteMapProvider.SiteMaps.Current.CurrentNode;
var parentNode = null;

// Current node will be null on any page that is not in the sitemap (or configured incorrectly to match)
if (currentNode != null)
{
    parentNode =  = currentNode.ParentNode;
}

// Parent node will be null if the current node is the root node
// or is null.
if (parentNode != null)
{
    parentNode.Description = "Some Parent Node";
}

SiteMap的目的是维护不同URL之间的关系,因此在运行时更改URL会稍微违背其目的。毕竟,如果URL发生更改但节点未更改层次结构中的位置,则该关系可能不再有效。

但是,您可以使用dynamic nodes动态添加节点,或者通过实现ISiteMapNodeProvider来创建基于动态数据的节点。此外,您可以通过在更新数据的每个操作上使用SiteMapCacheReleaseAttribute来强制立即重建SiteMap。

您还可以使用How to Make MvcSiteMapProvider Remember a User's Position - Forcing a Match中所述的savedRouteParameters伪造面包屑。这将使特定节点始终匹配指定路由值的每个值(例如“id”),因此该节点将有效地匹配多个URL。然后,您可以修改节点的标题和可见性,如链接文章中所述。