MOSS 2007 入门(7) : Navigation

         MOSS2007中的站点导航是基于ASP.NET的Navigation机制的,实际上在Masterpage中是可以任意定制页面中的导航控件的。在默认的TeamSite的Default.aspx中导航控件一共有三个.在MOSS中所有导航栏都是通过ASP:Menu控件或是ASP:TreeView控件绑定到一个NavigationDataSource实现的,因此每一个导航菜单都有两个控件共同实现。首先是一个ASP:Menu控件定义导航栏的样式和层级属性,其次是有一个 asp:SiteMapDataSource或SPNavigationProvider来作为导航栏的数据源。

         打开Default.Mater可以发现,三个导航栏的实现各有不同,顶部的导航栏是通过一个SharePoint:DelegateControl动态加载asp:SiteMapDataSource作为数据源的,而左侧的两个则是通过SharePoint:DelegateControl动态加载一个SPNavigationProvider实现的数据源。

         顶部的导航栏代码如下:

< SharePoint:AspMenu
   
ID ="TopNavigationMenu"
   Runat
="server"
   DataSourceID
="topSiteMap"
   EnableViewState
="false"
   AccessKey
="<%$Resources:wss,navigation_accesskey%>"
   Orientation
="Horizontal"
   StaticDisplayLevels
="2"
   MaximumDynamicDisplayLevels
="1"
   DynamicHorizontalOffset
="0"
   StaticPopoutImageUrl
="/_layouts/images/menudark.gif"
   StaticPopoutImageTextFormatString
=""
   DynamicHoverStyle-BackColor
="#CBE3F0"
   SkipLinkText
=""
   StaticSubMenuIndent
="0"
   CssClass
="ms-topNavContainer" >
  
< StaticMenuStyle />
  
< StaticMenuItemStyle  CssClass ="ms-topnav"  ItemSpacing ="0px" />
  
< StaticSelectedStyle  CssClass ="ms-topnavselected"   />
  
< StaticHoverStyle  CssClass ="ms-topNavHover"   />
  
< DynamicMenuStyle   BackColor ="#F2F3F4"  BorderColor ="#A7B4CE"  BorderWidth ="1px" />
  
< DynamicMenuItemStyle  CssClass ="ms-topNavFlyOuts" />
  
< DynamicHoverStyle  CssClass ="ms-topNavFlyOutsHover" />
  
< DynamicSelectedStyle  CssClass ="ms-topNavFlyOutsSelected" />
 
</ SharePoint:AspMenu >
 
< SharePoint:DelegateControl  runat ="server"  ControlId ="TopNavigationDataSource" >
  
< Template_Controls >
   
< asp:SiteMapDataSource
     
ShowStartingNode ="False"
     SiteMapProvider
="SPNavigationProvider"
     id
="topSiteMap"
     runat
="server"
     StartingNodeUrl
="sid:1002" />
  
</ Template_Controls >
 
</ SharePoint:DelegateControl >

    其中aspmenu的使用没什么难度,用户可以自定义CSS样式和定义一些显示的级次。这里插入一个SharePoint CssRegistration控件的用法,就是自定义CSS文件,前面有一篇文章我曾经专门讲过如何自定义CSS文件,这里介绍一个CssRegistration的用法,在SharePoint页面的Head中加入:

 

< SharePoint:CssRegistration  name ="<% $SPUrl:~Site/CustormStyle.css%>"  runat ="server" />

其中,name为该CSS文件的地址。

    值得一提的是下面的DelegateControl控件动态加载了一个SiteMapDataSource,其中SiteMapProvider="SPNavigationProvider"才是真正的指定数据源,而后面的StartingNodeUrl="sid:1002"则定义了该站点导航栏的起始位置,注意左侧的导航栏的起始位置和顶部的就不一样。因为顶部的导航栏通常都是从SiteCollection开始的,而左侧的导航栏是从当前站点开始的。ok,就是说可以通过更改顶部导航栏的MaximumDynamicDisplayLevels来让顶部导航栏显示更多的级次,从而显示站点中定义的List , Document Libraries等。

   开发人员可以通过定义一个XMLDataSource,然后将ASPMenu的DataSourceID指向XMLDataSource的ID来实现自定义的导航栏。例如写一个XMLDataSource 如下。

< asp:Menu  DataSourceID ="DemoXmlDataSource"  ID ="DemoCustomMenu"  runat ="server"  

BackColor
="#F1F1F1"  DynamicHorizontalOffset ="2"  Font-Names ="Verdana"  ForeColor ="#990000"  

StaticSubMenuIndent
="0"  Orientation ="Vertical"  StaticDisplayLevels ="2"  ItemWrap ="true"  

MaximumDynamicDisplayLevels
="0" >  

< DataBindings >  

< asp:MenuItemBinding  DataMember ="siteMapNode"  NavigateUrlField ="url"  

TextField
="title"  ToolTipField ="description"  ValueField ="title"   />  

</ DataBindings >  

</ asp:Menu >  

< asp:XmlDataSource  DataFile ="sitemap.xml"  ID ="DemoXmlDataSource"  runat ="server"  XPath ="/*/*" ></ asp:XmlDataSource >  

其中sitemap.xml文件如下。

<? xml version="1.0" encoding="utf-8"  ?>  

< siteMap  xmlns ="http://demo/testsite/SiteMap"   >  

< siteMapNode  title ="CustomMenu"  url ="CustomMenu.aspx"  description ="Go To Custom Menu" >  

    
< siteMapNode  title ="Menu Link 1"  url ="MenuLink1.aspx"  description ="Go To Menu Link 1"   />  

    
< siteMapNode  title ="Menu Link 2"  url ="MenuLink2.aspx"  description ="Go To Menu Link 2"   />  

</ siteMapNode >  

</ siteMap >  

     同样开发人员可以在代码中控制导航栏控件,下面的代码DEMO了使用C#修改并添加了一个导航栏控件(其中SiteDemo为一个SPWeb对象)。

SPNavigationNodeCollection nodesDemo  =  siteDemo.Navigation.QuickLaunch; 

SPNavigationNode navDemoNode 
=   new  SPNavigationNode( " Custom Menu " " # " false ); 

nodesDemo.AddAsFirst(navDemoNode); 

SPNavigationNode subnavDemoNode1 
=   new  SPNavigationNode( " Menu Item 1 " " http://demo:8001/ " true ); 

nodesDemo[
0 ].Children.AddAsFirst(subnavDemoNode1); 

SPNavigationNode subnavDemoNode2 
=   new  SPNavigationNode( " Menu Item 2 " " http://demo:8002 " true ); 

nodesDemo[
0 ].Children.AddAsFirst(subnavDemoNode2); 

siteDemo.Update(); 

你可能感兴趣的:(2007)