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.