2013-03-04 67 views
2

假設我有我的網頁上3個領域具有鏈接如何僅使用一個SiteMap創建多個不同的佈局?

  • 菜單
  • 頁腳

各有不同的環節,但有些環節重疊:

Overview

我正在使用MVCSiteMap提供者來完成這一點。我有一個網站地圖:

<?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

還差不多,但我不希望有使多個Sitemaps:Using Multiple MvcSiteMaps

回答

2

OP在這裏。我僅使用一個站點地圖完成了此操作。

要做到這一點:

  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>標籤)。

相關問題