C# 即使处理了Mvc.sitemap,DefaultSiteMapProvider仍返回空站点地图
我对这个项目有一个问题:我的站点地图总是空的 我已经设置了一个C# 即使处理了Mvc.sitemap,DefaultSiteMapProvider仍返回空站点地图,c#,asp.net-mvc,mvcsitemapprovider,C#,Asp.net Mvc,Mvcsitemapprovider,我对这个项目有一个问题:我的站点地图总是空的 我已经设置了一个Mvc.sitemap,设置了web.config条目。通过DefaultSiteMapProvider进行的调试显示.sitemap文件已被读取并正确处理。但是,返回的站点地图基本上是空的: http://localhost:59933/ 然而,当单步执行代码时,会发生一件奇怪的事情。我逐步浏览DefaultSiteMapProvider并查看root变量中的根节点。当设置isBuildingSiteMap=false时,接近方
Mvc.sitemap
,设置了web.config
条目。通过DefaultSiteMapProvider
进行的调试显示.sitemap文件已被读取并正确处理。但是,返回的站点地图基本上是空的:
http://localhost:59933/
然而,当单步执行代码时,会发生一件奇怪的事情。我逐步浏览DefaultSiteMapProvider并查看root
变量中的根节点。当设置isBuildingSiteMap=false
时,接近方法末尾时,根节点将重置为空节点。我不知道这可能会如何影响根节点的设置,但它在我的项目中始终发生
感谢您提供有关如何防止覆盖根节点的任何帮助。:)
来自DefaultSiteMapProvider的注释摘录,位于BuildSiteMap
方法(ll.660 ff.)末尾附近:
HttpContext.Current.Cache.Add(/*…*/);//此时,根节点是正确的
IsBuildingItemap=false;//执行这一行之后,`root`被重置为空节点。
siteMapXml=null;
Mvc.sitemap:
web.config
条目直接来自,仅针对站点地图名称进行了调整。我犯的错误与将DefaultNamespaces添加到ControllerBuilder有关。折线是:
ControllerBuilder.Current.defaultnamespace.Add(“My.Framework.Web”);
应该是:
ControllerBuilder.Current.defaultnamespace.Add(“My.Framework.Web.Controllers”);
MVC从未抱怨过这一点,很高兴找到了我的控制器
然而,一旦站点地图的构建完成,DefaultSiteMapProvider的行为就会有所不同,因为IsAccessibleForUser()突然成为决定子节点的一个因素。默认提供程序检查是否可以找到节点的控制器并且不在子名称空间中查找(除非名称空间以*
结尾,参见MvcSiteMapProvider.DefaultControllerTypeResolver.IsNamespaceMatch(string requestedNamespace,string targetNamespace)
)
因为我没有使用通配符,但假设当MVC工作时站点地图可以工作,它就咬了我的屁股。你是在问列表控制器为什么不出现在站点地图上吗?基本上,是的;但在我的实际项目中,我有几个动态节点提供程序,它们的所有节点都不会出现在生成的站点地图中,即使提供程序已执行并正确组装节点。在调试程序中单步执行代码时,根节点由于某种原因在DefaultSiteMapProvider
中提到的行处被完全屏蔽。您可以发布动态节点提供程序吗?我将这三个提供程序与完整的实际Mvc.sitemap一起放在本文的要点中(尽管对于上述站点地图,运行动态提供程序的SAN也会以同样的方式失败)。