2013-03-04 70 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>标签)。

相关问题