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>

Visibility がこれを行う方法だと思ったのですが、思い通りに動作しません。

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-include-current-node-with-mvcsitemapprovider

これも似ていますが、複数の SiteMap を作成する必要はありません: Using Multiple MvcSiteMaps

4

1 に答える 1

2

OPはこちら。1 つのサイト マップのみを使用してこれを実現しました。

これをする:

  1. 各サイトマップ要素に可視性タグを追加しました。例:

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

    この例"SideMenu Footer"では、私のタグです。String.Contains()後で可視性を判断するために使用します。

  2. 複数の異なる siteMap プロバイダーを異なるものに追加しましWeb.configsiteMapNodeVisibilityProvider:

    <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 に答える