2

假设我的页面上有 3 个区域有链接

  • 标题
  • 菜单
  • 页脚

每个都有不同的链接,但有些链接重叠:

概述

我正在使用 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="false">

    <mvcSiteMapNode title="Home" controller="Home" action="Index">

        <mvcSiteMapNode title="Link 1" controller="" action="" visibility="Header, Footer" />
        <mvcSiteMapNode title="Link 2" controller="" action="" visibility="Menu" />
        <mvcSiteMapNode title="Link 3" controller="" action="" visibility="Header, Menu" />
        <mvcSiteMapNode title="Link 4" controller="" action="" visibility="Menu, Footer, Header" />

    </mvcSiteMapNode>

</mvcSiteMap>

我认为也许可见性是做到这一点的方法,但它并没有按照我想要的方式工作。

Public Class MenuVisibilityProvider
    Implements ISiteMapNodeVisibilityProvider

    Public Function IsVisible(ByVal node As SiteMapNode, ByVal context As HttpContext, ByVal sourceMetadata As IDictionary(Of String, Object)) As Boolean Implements ISiteMapNodeVisibilityProvider.IsVisible
        Dim visibility As String = node("visibility")

        If visibility IsNot Nothing Then Return True

        Select Case visibility
            Case "Menu"
            Case "Header"
            Case "Footer"
                Return True
        End Select

        Return False
    End Function
End Class

我最终得到了每个区域的所有链接。

编辑澄清:

这是一个类似的问题,但也没有答案: https ://stackoverflow.com/questions/12845929/how-to-show-partial-site-map-including-current-node-with-mvcsitemapprovider

也类似,但我不想制作多个 SiteMap:Using Multiple MvcSiteMaps

4

1 回答 1

2

在这里。我只使用一个站点地图就完成了这项工作。

去做这个:

  1. 我为每个站点地图元素添加了可见性标签,例如:

    <mvcSiteMapNode title="Login" controller="Members" action="Login" visibility="SideMenu Footer" />
    

    在这个例子"SideMenu Footer"中是我的标签。稍后我将使用它String.Contains()来确定可见性。

  2. Web.config我在不同的地方添加了多个不同的站点地图提供者siteMapNodeVisibilityProvider

    <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="" 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" />
            <add name="NavSiteMapProvider"  ... siteMapNodeVisibilityProvider="RootNamespace.Namespace.NavVisibilityProvider, RootNamespace" ... />
            <add name="FooterSiteMapProvider"  ... siteMapNodeVisibilityProvider="RootNamespace.Namespace.FooterVisibilityProvider, RootNamespace" ... />
        </providers>
    </siteMap>
    
  3. 我创建了一个名为CustomVisibilityProvider. 在里面我为每个提供者创建了一个类(页脚、导航、菜单等)

    ' Note: VB.NET :P
    Public Class MenuVisibilityProvider
        Implements ISiteMapNodeVisibilityProvider

        Public Function IsVisible(ByVal node As SiteMapNode, ByVal context As HttpContext, ByVal sourceMetadata As IDictionary(Of String, Object)) As Boolean Implements ISiteMapNodeVisibilityProvider.IsVisible

            Dim visibility As String = node("visibility")

            If visibility Is Nothing Then Return False

            If visibility.Contains("Menu") Then Return True

            Return False
        End Function

    End Class

    Public Class NavVisibilityProvider
        Implements ISiteMapNodeVisibilityProvider

        ...
            If visibility.Contains("Nav") Then Return True
        ...
    End Class
  1. 当您在视图文件中时:

    @Html.MvcSiteMap("FooterSiteMapProvider").Menu
    

注意:您也可以给 Menu() 一个自定义视图,以便导航、页脚、菜单等以不同的方式呈现链接(有些可能是<ul></ul>格式,而另一些可能是<a>标签)。

于 2013-03-06T03:18:19.107 回答