0

我的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>

然而,在单步执行代码时会发生一件奇怪的事情。root我单步执行 DefaultSiteMapProvider 并观察变量中的根节点。在方法快结束时,根节点在设置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.站点地图:

<mvcSiteMap [...]>
  <mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Test" controller="Listing" action="Index">
  </mvcSiteMapNode>
</mvcSiteMap>

web.config条目直接来自文档页面,仅针对站点地图名称进行了调整。

4

1 回答 1

0

我犯的错误与将 DefaultNamespaces 添加到 ControllerBuilder 有关。虚线是:

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web");

应该是:

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web.Controllers");

MVC 从未抱怨过这一点,并且很高兴地找到了我的控制器。

然而,一旦站点地图的构建完成,DefaultSiteMapProvider 的行为会有所不同,因为 IsAccessibleForUser() 突然成为确定子节点的一个因素。默认提供程序检查是否可以找到节点的控制器并且不在子命名空间中查找(除非命名空间以 结尾.*,参见MvcSiteMapProvider.DefaultControllerTypeResolver.IsNamespaceMatch(string requestedNamespace, string targetNamespace))。

因为我没有使用通配符,但假设 MVC 工作时站点地图可以工作,所以它咬了我一口。

于 2013-03-04T17:32:47.007 回答