user808128
user808128

Reputation: 521

ASP.NET MVC SiteMap provider doesn't generate sitemap nodes from attributes

UPDATE: despite of all the text below, the issue was fairly small - the wrong assembly name in the includeAssembliesForScan parameter in the configuration of siteMap. It shouldn't include the ".dll" part.

I have v. 3.2.2.0 of MvcSiteMapProvider.

As described here, I use attributes to define sitemap nodes in code. But attributed actions aren't generated as nodes. Only nodes are generated that are explicitly defined in the sitemap.

That is my code:

sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
            xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd"
            enableLocalization="true">

  <mvcSiteMapNode 
        title="$resources:Mvc.sitemap,MainMenuTop_Main" 
        controller="Home" 
        action="Index" 
        key="Home">    

    <mvcSiteMapNode 
            title="$resources:Mvc.sitemap,Account" 
            controller="Account" 
            action="LogOn" 
            clickable="false" 
            key="Account" /> 

  </mvcSiteMapNode>

</mvcSiteMap>

home controller:

[HttpGet]
[MvcSiteMapProvider.MvcSiteMapNode(
    ParentKey = "Home", 
    Title = "$resources:Mvc.sitemap,MainMenuTop_About")]
public ActionResult About()
{
    return View();
}

account controller:

[HttpGet]
[MvcSiteMapProvider.MvcSiteMapNode(
    ParentKey = "Account", 
    Title = "$resources:Mvc.sitemap,Register")]
public ActionResult Register()
{
    return View();
}

So, these two actions won't become nodes in sitemap. In other words, MvcSiteMapNodeAttribute attribute didn't work. Why?

My siteMap part of web.config:

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
  <providers>
    <clear/>
    <add 
      name="MvcSiteMapProvider" 
      type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
      siteMapFile="~/Mvc.Sitemap" 
      securityTrimmingEnabled="true" 
      cacheDuration="5" 
      enableLocalization="true" 
      scanAssembliesForSiteMapNodes="true" 
      includeAssembliesForScan="Site2.dll" 
      excludeAssembliesForScan="" 
      attributesToIgnore="visibility" 
      nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" 
      controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" 
      actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" 
      aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" 
      siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" 
      siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" 
      siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider"/>
  </providers>
</siteMap>

Upvotes: 0

Views: 2287

Answers (1)

NightOwl888
NightOwl888

Reputation: 56909

You need to ensure you have specified to scan for sitemap nodes in your configuration and also supply the assembly name that your controllers reside in. Note that you only need to give the name of the assembly, not a path to it. The assembly must be referenced from your project.

Note that in v4, your MVC project is now registered automatically by the NuGet package, but if you put your controllers in another assembly, you will need to add your controller assembly to the list (separated by commas).

MvcSiteMapProvider v4 (internal DI):

<!-- web.config -->
<appSettings>
    <add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" />
    <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="MyAssemblyName" />
</appSettings>

MvcSiteMapProvider v4 (external DI):

// DI Module (file name varies depending on DI container)
string[] includeAssembliesForScan = new string[] { "MyAssemblyName" };

You also need to ensure the ReflectionSiteMapNodeProvider is registered in your configuration.

MvcSiteMapProvider v3:

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
    <providers>
        <clear/>
        <add name="MvcSiteMapProvider"
             type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
             siteMapFile="~/Mvc.Sitemap"
             securityTrimmingEnabled="true"
             cacheDuration="5"
             enableLocalization="true"
             scanAssembliesForSiteMapNodes="true"
             excludeAssembliesForScan=""
             includeAssembliesForScan="MyAssemblyName"
             attributesToIgnore="visibility"
             nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider"
             controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" 
             actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider"
             aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider"
             routeMethod=""
             siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider"
             siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider"
             siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider"/>
    </providers>
</siteMap>

Upvotes: 1

Related Questions