5

King Lau - 博客园

 3 years ago
source link: https://www.cnblogs.com/wfconquer/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
King Lau
  2006年12月22日

         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实现的数据源。

         顶部的导航栏代码如下:

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

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

None.gif<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 如下。

None.gif<asp:Menu DataSourceID="DemoXmlDataSource" ID="DemoCustomMenu" runat="server" 
None.gif
None.gifBackColor="#F1F1F1" DynamicHorizontalOffset="2" Font-Names="Verdana" ForeColor="#990000" 
None.gif
None.gifStaticSubMenuIndent="0" Orientation="Vertical" StaticDisplayLevels="2" ItemWrap="true" 
None.gif
None.gifMaximumDynamicDisplayLevels="0"> 
None.gif
None.gif<DataBindings> 
None.gif
None.gif<asp:MenuItemBinding DataMember="siteMapNode" NavigateUrlField="url" 
None.gif
None.gifTextField="title" ToolTipField="description" ValueField="title" /> 
None.gif
None.gif</DataBindings> 
None.gif
None.gif</asp:Menu> 
None.gif
None.gif<asp:XmlDataSource DataFile="sitemap.xml" ID="DemoXmlDataSource" runat="server" XPath="/*/*"></asp:XmlDataSource> 

其中sitemap.xml文件如下。

None.gif<?xml version="1.0" encoding="utf-8" ?> 
None.gif
None.gif<siteMap xmlns="http://demo/testsite/SiteMap" > 
None.gif
None.gif<siteMapNode title="CustomMenu" url="CustomMenu.aspx" description="Go To Custom Menu"> 
None.gif
None.gif    <siteMapNode title="Menu Link 1" url="MenuLink1.aspx" description="Go To Menu Link 1" /> 
None.gif
None.gif    <siteMapNode title="Menu Link 2" url="MenuLink2.aspx" description="Go To Menu Link 2" /> 
None.gif
None.gif</siteMapNode> 
None.gif
None.gif</siteMap> 
None.gif

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

None.gifSPNavigationNodeCollection nodesDemo = siteDemo.Navigation.QuickLaunch; 
None.gif
None.gifSPNavigationNode navDemoNode = new SPNavigationNode("Custom Menu", "#", false); 
None.gif
None.gifnodesDemo.AddAsFirst(navDemoNode); 
None.gif
None.gifSPNavigationNode subnavDemoNode1 = new SPNavigationNode("Menu Item 1", "http://demo:8001/", true); 
None.gif
None.gifnodesDemo[0].Children.AddAsFirst(subnavDemoNode1); 
None.gif
None.gifSPNavigationNode subnavDemoNode2 = new SPNavigationNode("Menu Item 2", "http://demo:8002", true); 
None.gif
None.gifnodesDemo[0].Children.AddAsFirst(subnavDemoNode2); 
None.gif
None.gifsiteDemo.Update(); 

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK