【问题标题】:DefaultSiteMapProvider returns empty site map even though Mvc.sitemap is processed即使处理了 Mvc.sitemap,DefaultSiteMapProvider 也会返回空站点地图
【发布时间】:2013-02-25 17:00:52
【问题描述】:

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,仅针对站点地图名称进行了调整。

【问题讨论】:

  • 您是否在问为什么列表控制器没有出现在站点地图中?
  • 基本上,是的;但在我的实际项目中,我有几个动态节点提供程序,所有这些节点都不会出现在生成的站点地图中,即使提供程序已执行并正确组装节点。在调试器中单步执行代码时,由于某种原因,根节点在DefaultSiteMapProvider 中提到的行处被完全删除。
  • 你能发布动态节点提供者吗?
  • 我将三个提供程序连同完整的、实际的 Mvc.sitemap 一起放入了这个要点(尽管对于上述站点地图,它以相同的方式失败,没有运行动态提供程序)。 gist.github.com/anonymous/5047048

标签: c# asp.net-mvc mvcsitemapprovider


【解决方案1】:

我犯的错误与将 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 工作时站点地图也能工作,所以它咬了我一口。

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2012-05-18
    • 2017-10-20
    • 2016-06-11
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多