MvcSiteMapProvider MVC5自动生成站点地图

时间:2014-09-16 19:57:52

标签: c# asp.net-mvc mvcsitemapprovider

我正在尝试自动生成站点地图,我正在使用以下内容 web.config中:

<appSettings>
  <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="WebUI" />
        <add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" />
        <add key="MvcSiteMapProvider_UseExternalDIContainer" value="false" />
    <add key="MvcSiteMapProvider_UseExternalDIContainer" value="false"/>
    <add key="MvcSiteMapProvider_SiteMapFileName" value="~/Mvc.sitemap"/>

    <add key="MvcSiteMapProvider_ExcludeAssembliesForScan" value=""/>
    <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value=""/>
    <add key="MvcSiteMapProvider_AttributesToIgnore" value=""/>
    <add key="MvcSiteMapProvider_CacheDuration" value="5"/>
    <add key="MvcSiteMapProvider_ControllerTypeResolverAreaNamespacesToIgnore" value=""/>
    <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value=""/>
    <add key="MvcSiteMapProvider_VisibilityAffectsDescendants" value="true"/>
    <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="false"/>
    <add key="MvcSiteMapProvider_EnableLocalization" value="true"/>
    <add key="MvcSiteMapProvider_EnableSitemapsXml" value="true"/>
    <add key="MvcSiteMapProvider_EnableResolvedUrlCaching" value="true"/>
    <add key="MvcSiteMapProvider_EnableSiteMapFile" value="true"/>
    <add key="MvcSiteMapProvider_IncludeRootNodeFromSiteMapFile" value="true"/>
    <add key="MvcSiteMapProvider_EnableSiteMapFileNestedDynamicNodeRecursion" value="false"/>
    <add key="MvcSiteMapProvider_UseTitleIfDescriptionNotProvided" value="true"/>
</appSettings>

控制器:

        [MvcSiteMapNode(Title = "Healthcare", Key = "Healthcare", ParentKey = "Home")]
        public ActionResult Healthcare (){..}

站点地图MVC.sitemap没有更新? 我将以下行更改为ture

 <add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true"/>

出现此错误:

Not all configured nodes could be paired with a parent node. Check your parent keys to ensure that a node with a corresponding key exists in the SiteMap. Note that the match is case sensitive.
SiteMapCacheKey: 'sitemap://localhost/'
Orphaned Nodes:
ParentKey: 'Home' | Controller: 'Home' | Action: 'Healthcare' | Area: '' | URL: '/Home/Healthcare' | Key: 'Healthcare' | Source: 'MvcSiteMapNodeAttribute' 

非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

目前没有自动生成SiteMap的内置方法。必须使用一个可用的节点定义选项(XML file[MvcSiteMapNode] attributedynamic node providers或ISiteMapNodeProvider)手动配置每个节点。

这样做的主要原因是MVC没有预定义的页面层次结构,只有控制器和操作,因此您最终会得到一个SiteMap对象,该对象具有一个根节点及其下面的所有页面。也不可能自动检测动作参数的所有可能值。在大多数情况下,扫描的SiteMap对于网站导航来说是无用的。

也就是说,如果您只想创建一个XML站点地图以提交给搜索引擎(无论如何都是平的),或者您可以想办法告诉MvcSiteMapProvider如何嵌套键/父键关系以进行导航,可以实现ISiteMapNodeProvider并自己扫描控制器和操作(您可以使用ReflectionSiteMapNodeProvider作为指南)。

现有配置的一些指针:

使用MvcSiteMapProvider_ScanAssembliesForSiteMapNodes属性时,需要将[MvcSiteMapNode]设置为true,以便您正确使用该部分。

但是,您已将MvcSiteMapProvider_IncludeAssembliesForScanMvcSiteMapProvider_UseExternalDIContainer设置定义了两次。

该错误表明您的SiteMap中没有任何节点具有名为&#34; Home&#34;的密钥,因此它不知道层次结构中的哪个位置放置您已配置的[MvcSiteMapNode]

由于您已将MvcSiteMapProvider_EnableSiteMapFileMvcSiteMapProvider_IncludeRootNodeFromSiteMapFile都设置为true,因此您必须在Mvc.sitemap文件中定义根节点,并为其指定一个明确的键&#34; Home&#34; (无论如何,这是你的意图)。

<mvcSiteMapNode title="Home" controller="Home" action="Index" key="Home">
    <!-- If you have any additional nodes you want to define in XML, put them here -->
</mvcSiteMapNode>

如果您只想使用[MvcSiteMapNode]配置节点(没有XML配置),则应将MvcSiteMapProvider_EnableSiteMapFile设置为false并删除Mvc.sitemap和MvcSiteMapProvider.xsd文件。在这种情况下,您需要使用[MvcSiteMapNode]定义根节点(没有父键的节点)。

[MvcSiteMapNode(Title = "Home", Key = "Home")]
public ActionResult Index()
{
    return View();
}