【发布时间】:2014-05-08 19:22:43
【问题描述】:
我只是将 MvcSiteMapProvider 从 v3 升级到 v4.6.3。
我看到升级说明提示:
一般来说,任何对System.Web.SiteMap.Provider 的引用都需要更新为MvcSiteMapProvider.SiteMaps.Current
我正在尝试使用以下方法获取站点地图节点:
SiteMaps.Current.FindSiteMapNode(rawUrl)
但它总是返回 null
我查看了代码。在站点地图中,它实际上是在调用函数:
protected virtual ISiteMapNode FindSiteMapNodeFromUrlMatch(IUrlKey urlToMatch)
{
if (this.urlTable.ContainsKey(urlToMatch))
{
return this.urlTable[urlToMatch];
}
return null;
}
它试图在 urlTable 中找到匹配项。
我正在使用 XmlSiteMapProvider 的默认实现。
它定义了var url = node.GetAttributeValue("url");
siteMapNode.Url = url;
siteMapNode.UrlResolver = node.GetAttributeValue("urlResolver");
如果我没有在 .sitemap 文件中定义 url 或 urlResolver 属性。这些变量在生成节点时设置为空字符串。
当这个节点被传递给SiteMap中的AddNode函数时。
添加节点时
bool isMvcUrl = string.IsNullOrEmpty(node.UnresolvedUrl) && this.UsesDefaultUrlResolver(node);
此代码将检查是否存在url 或urlResolver
// Only store URLs if they are clickable and are configured using the Url
// property or provided by a custom URL resolver.
if (!isMvcUrl && node.Clickable)
{
url = this.siteMapChildStateFactory.CreateUrlKey(node);
// Check for duplicates (including matching or empty host names).
if (this.urlTable
.Where(k => string.Equals(k.Key.RootRelativeUrl, url.RootRelativeUrl, StringComparison.OrdinalIgnoreCase))
.Where(k => string.IsNullOrEmpty(k.Key.HostName) || string.IsNullOrEmpty(url.HostName) || string.Equals(k.Key.HostName, url.HostName, StringComparison.OrdinalIgnoreCase))
.Count() > 0)
{
var absoluteUrl = this.urlPath.ResolveUrl(node.UnresolvedUrl, string.IsNullOrEmpty(node.Protocol) ? Uri.UriSchemeHttp : node.Protocol, node.HostName);
throw new InvalidOperationException(string.Format(Resources.Messages.MultipleNodesWithIdenticalUrl, absoluteUrl));
}
}
// Add the URL
if (url != null)
{
this.urlTable[url] = node;
}
urlTable最后没有添加url,导致FindSiteMapNode找不到任何东西。
我不确定是否需要特定配置。或者我应该实现自定义XmlSiteMapProvider 只需添加网址。
【问题讨论】:
-
我只想通过url或者路由信息找到Node:action、controller、area。 FindSiteMapNode 函数依赖于 urlTable。有没有其他方法可以搜索?
标签: mvcsitemapprovider asp.net-mvc-sitemap