我对MvcSiteMapProvider项目有疑问:我的站点地图始终为空。
我已设置Mvc.sitemap
,设置web.config
个条目。通过DefaultSiteMapProvider
进行调试,向我显示.sitemap文件已被读取并正确处理。但是,返回的站点地图基本上是空的:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>
http://localhost:59933/
</loc>
</url>
</urlset>
然而,在单步执行代码时会发生奇怪的事情。我逐步执行DefaultSiteMapProvider并观察root
变量中的根节点。在方法结束时,根节点在设置isBuildingSiteMap = false
时会重置为空节点。我不知道这可能会如何影响设置根节点,但它在我的项目中始终如一。
如何防止root
节点被覆盖的任何帮助表示赞赏。 :)
来自DefaultSiteMapProvider的注释摘录,靠近BuildSiteMap
方法的末尾(ll.660 ff。):
HttpContext.Current.Cache.Add(/*...*/); // At this point the root node is correct
isBuildingSiteMap = false; // after executing this line, `root` gets reset to an empty node.
siteMapXml = null;
Mvc.sitemap:
<mvcSiteMap [...]>
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Test" controller="Listing" action="Index">
</mvcSiteMapNode>
</mvcSiteMap>
web.config
条目直接来自documentation page,仅针对站点地图名称进行了调整。
答案 0 :(得分:0)
我犯的错误与将DefaultNamespaces添加到ControllerBuilder有关。断线是:
ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web");
应该是:
ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web.Controllers");
MVC从未对此抱怨过,并愉快地找到了我的控制器。
然而,一旦站点地图的构建完成,DefaultSiteMapProvider的行为就会不同,因为IsAccessibleForUser()突然成为确定ChildNodes的一个因素。默认提供程序检查是否可以找到节点的控制器并且不查找子命名空间(除非命名空间以.*
结尾,参见MvcSiteMapProvider.DefaultControllerTypeResolver.IsNamespaceMatch(string requestedNamespace, string targetNamespace)
)。
因为我没有使用通配符,但是假设当MVC工作时站点地图会起作用,它会让我陷入困境。