DefaultSiteMapProvider返回空的站点地图,即使Mvc.sitemap已被处理
本文关键字:sitemap Mvc 处理 即使 返回 站点 地图 DefaultSiteMapProvider | 更新日期: 2023-09-27 18:01:07
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
条目直接来自文档页面,仅根据站点地图名称进行了调整。
我犯的错误与将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工作时网站地图会起作用,这让我很恼火。