MvcSiteMapProvider хранит все узлы в базе данных

Теперь у меня есть Mvc.sitemap xml файл со следующими данными:

<mvcSiteMapNode title="RTS" imageUrl="fa fa-share-alt" controller="Dashboard" action="Index" area="Referrals" >
  <mvcSiteMapNode title="Dashboard" controller="Dashboard" action="Index" area="Referrals" ></mvcSiteMapNode>

  <mvcSiteMapNode title="Referrals" controller="List" action="Index" area="Referrals" visibility="SiteMapPathHelper,!*">
    <mvcSiteMapNode title="New Referral" controller="List" action="New" area="Referrals" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id" />
    <mvcSiteMapNode title="Details" controller="List" action="Details" area="Referrals" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id" >
      <mvcSiteMapNode title="Edit" action="Edit" area="Referrals" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id"/>
    </mvcSiteMapNode>
  </mvcSiteMapNode>

</mvcSiteMapNode>

И я хочу хранить все эти узлы в БД, и иметь только один не корневой узел, как это:

<mvcSiteMapNode visibility="MenuHelper,!*" title="Home" controller="Home" action="Index"  imageUrl="fa fa-home">
    <mvcSiteMapNode visibility="MenuHelper,!*" title="Home" controller="Home" action="Index"  imageUrl="fa fa-home" dynamicNodeProvider="RMP.WebClient.Infrastructure.SiteMapDynamicNodeProvider, RMP.WebClient">
    </mvcSiteMapNode>
  </mvcSiteMapNode>

Могу ли я сделать это с помощью DynamicNodeProvider или какой лучший способ реализовать эту логику?

1 ответ

Решение

Да, вы можете использовать одного поставщика динамических узлов для предоставления всех узлов, если вы предпочитаете это. Вам просто нужно убедиться, что вы правильно сопоставили все свойства ключа и родительского ключа. Это ваш лучший выбор, если вы используете внутренний DI.

Если используется внешний DI, есть лучший вариант. Вы можете реализовать ISiteMapNodeProvider, и тогда вам вообще не понадобится файл XML (или атрибут.NET) для размещения вашего корневого узла. ISiteMapNodeProvider реализован аналогично IDyanmicNodeProvider, основное отличие состоит в том, что он работает на более низком уровне и требует внешнего DI для внедрения реализации. Посмотрите этот ответ для примера реализации ISiteMapNodeProvider и этот ответ, чтобы увидеть, как вы можете внедрить свою реализацию. Вам нужно только внедрить встроенный XmlSiteMapNodeProvider, если вы собираетесь использовать XML для конфигурации узла, и ReflectionSiteMapNodeProvider, если вы собираетесь использовать [MvcSiteMapNodeAttribute] для конфигурации узла.

Обратите внимание, что в будущих версиях MvcSiteMapProvider вы сможете использовать ISiteMapNodeProvider без внешнего контейнера DI.

Другие вопросы по тегам