现在我有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>
我想将所有这些节点存储在DB中,并且只有一个不是根节点,如下所示:
<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或实现此逻辑的最佳方法吗?
答案 0 :(得分:1)
是的,如果您愿意,可以使用单个动态节点提供程序提供所有节点。您只需确保正确映射所有键和父键属性。如果您使用内部DI,这是您最好的选择。
如果使用外部DI,则有更好的选择。您可以实现ISiteMapNodeProvider,然后您根本不需要XML文件(或.NET属性)来托管您的根节点。 ISiteMapNodeProvider以与IDyanmicNodeProvider类似的方式实现,主要区别在于它在较低级别运行并需要外部DI来注入实现。有关示例ISiteMapNodeProvider实现和this answer,请参阅this answer以了解如何注入实现。如果打算使用XML进行节点配置,则只需要注入内置的XmlSiteMapNodeProvider;如果打算使用[MvcSiteMapNodeAttribute]进行节点配置,则需要注入ReflectionSiteMapNodeProvider。
请注意,在MvcSiteMapProvider的未来版本中,您将能够在没有外部DI容器的情况下使用ISiteMapNodeProvider。