【问题标题】:How do I create multiple different layouts using only one SiteMap?如何仅使用一个站点地图创建多个不同的布局?
【发布时间】:2013-03-06 11:24:25
【问题描述】:

假设我的页面上有 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

也类似,但我不想制作多个站点地图:Using Multiple MvcSiteMaps

【问题讨论】:

    标签: asp.net mvcsitemapprovider


    【解决方案1】:

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

    为此:

    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() 一个自定义视图,以便导航、页脚、菜单等以不同方式呈现链接(有些可能是 &lt;ul&gt;&lt;/ul&gt; 格式,而另一些可能是 &lt;a&gt; 标签)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2014-04-07
      • 2011-06-30
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多