Поставщик ASP.NET MVC SiteMap не создает узлы карты сайта из атрибутов

ОБНОВЛЕНИЕ: несмотря на весь приведенный ниже текст, проблема была довольно небольшой - неправильное имя сборки в параметре includeAssembliesForScan в конфигурации siteMap. Он не должен содержать часть ".dll".

У меня есть версия 3.2.2.0 MvcSiteMapProvider.

Как описано здесь, я использую атрибуты для определения узлов карты сайта. в коде. Но атрибутированные действия не генерируются как узлы. Генерируются только те узлы, которые явно определены в карте сайта.

Это мой код:

карта сайта:

<?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>

домашний контроллер:

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

контроллер аккаунта:

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

Таким образом, эти два действия не станут узлами в карте сайта. Другими словами, атрибут MvcSiteMapNodeAttribute не работал. Почему?

Моя часть карты сайта 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>

person user808128    schedule 25.04.2012    source источник
comment
У меня просто была похожая проблема. Можете ли вы рассказать мне, как выглядит ваше стандартное пространство имен и имя вашей сборки? В моем приложении они не совпадали, и это было причиной того, что MvcSiteMap думал, что это будет внутри области, что привело к неправильному созданию URL-адреса.   -  person hydr    schedule 04.05.2012
comment
У меня такое же имя пространства имен и имя сборки. Но ресурсы для заголовков mvcSiteMapNode находятся в пространстве имен Resources (на самом деле это папка проекта App_GlobalResources).   -  person user808128    schedule 16.05.2012
comment
И у меня нет областей в моем приложении ASP.NET MVC.   -  person user808128    schedule 16.05.2012
comment
Может ли помочь, если я создам область и помещу в нее весь свой предыдущий контент сайта, а затем укажу имя этой области во всех частях провайдера MVC SiteMap (карта сайта, атрибуты действий и т. д.)?.. Но я думаю, что это будет слишком сложно просто заставить работать провайдер MVC SiteMap.   -  person user808128    schedule 16.05.2012


Ответы (1)


Вам необходимо убедиться, что вы указали сканирование узлов карты сайта в своей конфигурации, а также указали имя сборки, в которой находятся ваши контроллеры. Обратите внимание, что вам нужно указать только имя сборки, а не путь к ней. На сборку должна быть ссылка из вашего проекта.

Обратите внимание, что в v4 ваш проект MVC теперь автоматически регистрируется пакетом NuGet, но если вы поместите свои контроллеры в другую сборку, вам нужно будет добавить свою сборку контроллера в список (через запятую).

MvcSiteMapProvider v4 (внутренний DI):

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

MvcSiteMapProvider v4 (внешний DI):

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

Вам также необходимо убедиться, что ReflectionSiteMapNodeProvider зарегистрирован в вашей конфигурации.

Мвксайтемаппровидер 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>
person NightOwl888    schedule 30.10.2013
comment
У меня есть версия 3.2.2.0 MvcSiteMapProvider. У меня также есть та же часть siteMap в web.config, что и у вас, за исключением имени сборки (я обновляю свой вопрос, чтобы поместить туда свою конфигурацию siteMap). Мои контроллеры находятся в той же сборке, что и мой сайт. Но опять же узлы, которые явно не определены в файле mvc.sitemap, не создаются как узлы. Другими словами, атрибут MvcSiteMapNodeAttribute не работал. Пробую обновить MvcSiteMapProvider до v.4 - может тогда заработает. - person user808128; 28.11.2013
comment
Имя вашей сборки не должно включать расширение .dll. Оно должно совпадать с тем, что настроено в поле Имя сборки в свойствах проекта на вкладке Приложение. - person NightOwl888; 28.11.2013
comment
Исправляю название сборки. Но возникает другая проблема - как минимум корневой узел должен быть определен в файле mvc.sitemap, потому что метод действия с атрибутом просто без параметра ParentKey атрибута не распознается как корневой узел. Как определить корневой узел только с атрибутом MvcSiteMapNodeAttribute — какие минимально необходимые параметры? - person user808128; 29.11.2013
comment
Кроме того, я использую только Заголовок и Ключ для моего предполагаемого корневого (родительского для всех остальных) узла, но этого кажется недостаточно. - person user808128; 29.11.2013
comment
По умолчанию корневой узел должен быть определен в файле .sitemap. В v4 вы можете указать игнорировать корневой узел с MvcSiteMapProvider_IncludeRootNodeFromSiteMapFile=false. Если вы не собираетесь использовать XML для настройки SiteMap, задайте MvcSiteMapProvider_EnableSiteMapFile=false. Насколько мне известно, в v3 не было возможности настроить его без вашего корневого узла в XML, но это единственный узел, который должен быть там. - person NightOwl888; 29.11.2013
comment
Не могли бы вы помочь мне с еще один вопрос , пожалуйста? - person user808128; 29.11.2013