• MOSS点滴(3):说说MOSS中的母版页


    MOSS中有两种页面:Site Pages 和Application Pages,他们分别使用不同的母版页,Site Pages 使用的是
    Default.master, Application Pages使用的是Application.master。我们下面讨论的主要是针对
    default.master的,因为Application.master是不支持被定制的。

    Default.master在安装目录的C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL\目录下,站点中引用的相对路径为/_catalogs/masterpage/default.master。MOSS中
    母版页是可以嵌套的:<%@ Master master=MyParent.master %>。不能添加webpart区域,但可以添加静
    态的wetpart 。
     

    该母版页中主要有以下几部分:
    1. 链接,菜单,图标和导航控件。
    MOSS已经给我们提供了很多封装好的控件,比如SPWebPartManager,导航的控件等等。
    2. 占位符(Named Placeholds)
    我们可以利用占位符来给继承自Default.master的页面添加内容,下面会有例子。
    3. Delegate controls
    这个词就不翻译了,使用它可以替换掉母版页中的内容。
     
    下面是Default.master中的一段代码:
    %@Master language="C#"%
    <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
    Assembly="Microsoft.SharePoint, …" %>
    <HTML runat="server">
     
    <HEAD runat="server">
      <!-- SharePoint 控件-->
      <SharePoint:CssLink ID="CssLink1" runat="server"/>
     
    <SharePoint:Theme ID="Theme1" runat="server"/> 
      <SharePoint:ScriptLink language="javascript" name="core.js" Defer="true" runat="server"/>
     
    <!-- Named Placeholders -->  
      <Title ID=onetidTitle> 
      <asp:ContentPlaceHolder id=PlaceHolderPageTitle runat="server"/> 
      </Title>  
    <asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead"  runat="server"/> 
    <!-- Named Delegate Control -->  
    <SharePoint:DelegateControl ID="DelegateControl1" runat="server" ControlId="AdditionalPageHead"
      AllowMultipleControls="true"/>
    </HEAD>


    Head中的CssLink 和Theme,ScriptLink都是moss中标准的服务器控件,这两个控件在application.master中也是有的.
    Head中有两个Named Placeholders,ID 分别为PlaceHolderPageTitle 和 PlaceHolderAdditionalPageHead,
    PlaceHolderPageTitle表示页面的标题,PlaceHolderAdditionalPageHead表示页面的Head区域,你可以添加类似
    <meta>的标签,示例如下:
    <%@ Page MasterPageFile="~masterurl/default.master" %>
    <asp:Content ID="PageTitle" runat="server" ContentPlaceHolderID="PlaceHolderPageTitle">
      My Custom Page Title
    </asp:Content>
    <asp:Content ID="AdditionalPageHead" runat="server" ContentPlaceHolderID="PlaceHolderAdditionalPageHead">
      <META name="keywords" content="Software, Consulting, Money, Fame" />
    </asp:Content>


    下面是MOSS中已定义的Named placeholds

    占位符的Name

    描述

    PlaceHolderAdditionalPageHead 需要写在页面<head>标签里的附加内容,如引用的脚本或样式文件
    PlaceHolderBodyAreaClass 附加在页面顶部的body中的样式
    PlaceHolderBodyLeftBorder 页面body的边框元素
    PlaceHolderBodyRightMargin 页面body的右边距
    PlaceHolderCalendarNavigator 在页面中有日历时为其显示一个日期选择框
    PlaceHolderFormDigest 这是页面中必备的 "form digest"安全组件
    PlaceHolderGlobalNavigation 站点导航
    PlaceHolderHorizontalNav 导航标签
    PlaceHolderLeftActions 左侧导航区下面的动作区
    PlaceHolderLeftNavBar 左侧导航区
    PlaceHolderLeftNavBarBorder 左侧导航区的边框元素
    PlaceHolderLeftNavBarDataSource 左侧导航区菜单的数据源
    PlaceHolderLeftNavBarTop 左侧导航区上面的导航区
    PlaceHolderMain 页面主体
    PlaceHolderMiniConsole 一个放置页面级命令的地方,比如在WIKI站点里的Edit Page, History, Incoming Links
    PlaceHolderNavSpacer 左侧导航区的宽度
    PlaceHolderPageDescription 页面描述区
    PlaceHolderPageImage 页面左上的图标
    PlaceHolderPageTitle 页面的<Title>,通常显示在浏览器的标题栏
    PlaceHolderSearchArea 搜索框
    PlaceHolderSiteName 站点名称
    PlaceHolderTitleAreaClass TitleArea附加的样式
    PlaceHolderTitleAreaSeparator TitleAreaSeparator区
    PlaceHolderTitleBreadcrumb TitleBreadcrumb区
    PlaceHolderTitleInTitleArea Breadcrumb区下面的标题
    PlaceHolderTitleLeftBorder Title区左侧边框
    PlaceHolderTitleRightMargin Title区右侧空白
    PlaceHolderTopNavBar 标签导航区
    PlaceHolderUtilityContent 页面底部需要的一块特殊内容
    SPNavigation 在 Windows SharePoint Services中默认为空,用于附加的页面编辑控件
    WSSDesignConsole 页面编辑控件,当页面进入编辑页面模式时使用(当我们点 Site Actions, Edit Page后)


    导航组件:
    MOSS提供了很多标准的导航组件,如NavigationProvider, SPSiteMapProvider, SPContentMapProvider, 和SPXmlContentMapProvider,所有被激活的你都可以在站点的web.config的siteMap节点中配置,示例如下:

    <siteMap defaultProvider="CurrentNavSiteMapProvider" enabled="true">
    <providers>
    <add name="SPNavigationProvider" type="Microsoft.SharePoint.Navigation.SPNavigationProvider,
    Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> </providers> </siteMap>
     

    顶部链接栏和快速启动菜单是Default.master 中定义的两个主导航组件。顶部链接栏是即AspMenu。它由数据
    源为SiteMapDataSource 控件的 SPNavigationProvider的定义的。快速启动和顶部链接栏是以同样的方式定义
    的,他们之间的区别是顶部链接的SiteMapDataSource中的StartingNodeUrl属性使用值为 sid:1002,而快速启
    动菜单对应的StartingNodeUrl 属性值为 sid:1025。1002和1025是用于跟踪导航节点的,顶部链接的顶部节点的
    id是1002,快速启动的顶部节点的id为1025。

    顶部链接和快速启动的节点的添加也是非常方便的,在后台的"网站设置"即可以灵活的设置.也可以使用MOSS对
    象模型来填加,示例代码如下:

    SPWeb site = (SPWeb)properties.Feature.Parent;
    SPNavigationNodeCollection topNav = site.Navigation.TopNavigationBar;
    // 创建下拉菜单SPNavigationNode DropDownMenu1;
    DropDownMenu1 = new SPNavigationNode("SitePages", "", false);
    topNav[0].Children.AddAsLast(DropDownMenu1);
    // 添加节点
    DropDownMenu1.Children.AddAsLast(new SPNavigationNode("Page1","SitePages/Page1.aspx"));
    DropDownMenu1.Children.AddAsLast(new SPNavigationNode("Page2","SitePages/Page2.aspx"));
     

    Delegate Controls

    我们可以设置它影响的范围,有四个级分别是:site scope, site collection scope, Web application scope, 和
    farm scope。下面我们就以MOSS中的搜索栏为例说明,下面是MOSS中默认的:

    <SharePoint:DelegateControl
      ID="DelegateControl5"
      runat="server"
      ControlId="SmallSearchInputBox"
    />

    MOSS中使用名为ContentLightup的feature来实现这功能的,SearchArea.xml中对应的代码为:

    <Control
      Id="SmallSearchInputBox"
      Sequence="100"
      ControlSrc="~/_controltemplates/searcharea.ascx"
    />
    

    下面我们就用我们自己定制的搜索栏来替默认的,我们就需要在我们自定义的feature中做如下设置:

    <Control
      Id="SmallSearchInputBox"
      Sequence="10"
      ControlSrc="~/_controltemplates/OurSearchArea.ascx"
    />
    
    在这里要注意一点,Sequence属性的值一定要小于默认提供的,这个Sequence的值在wss中是100,在moss
    标准版中是50,企业版是25。这个你可以去MOSS的安装目录下搜索feature中对应的xml文件来核对(名字:
    SearchArea.xml)。由于我们定义的这个是站点的级别的,那么你整个站点页面中的搜索控件都会被替换为
    你自己定制的样式。
    下面就是我们自定义的搜索样式的页面.ascx代码:
    <%@ Control Language="C#" %> 
    <script runat="server">
    protected void OurSearchArea_Click(object sender, EventArgs e)
    {    }
    </script> 
    <table> 
     <tr><td><asp:Button ID="cmdRunSearch" runat="server" Text="Search" OnClick="OurSearchArea_Click" /></td>
     <td><asp:TextBox ID="txtSearchText" runat="server" Width="120" /></td></tr>
    </table>
    
    
    下图是替换的效果:
    05 
     
    上面我们使用了用户控件方式(.ascx),我们还可以使用控件类的方式来自定义,下面是MOSS提供的标准的
    QuickLaunchDataSource.
     
    <SharePoint:DelegateControl
         ID="DelegateControl8" runat="server"
         ControlId="QuickLaunchDataSource">
      <Template_Controls>
        <asp:SiteMapDataSource
          SiteMapProvider="SPNavigationProvider"
          ShowStartingNode="False"
          id="QuickLaunchSiteMap"
          StartingNodeUrl="sid:1025"
          runat="server" />
      </Template_Controls>
    </SharePoint:DelegateControl>
    
    
    这个DelegateControl 使用QuickLaunchDataSource控件来填充他的内容,并不是asc.aspx用户控件的
    方式。他默认使用了id为QuickLaunchSiteMap的SiteMapDataSource控件,如果你想替换这个控件,你
    可以在feature中添加一下代码
     
    <Control Id="QuickLaunchDataSource" Sequence="1" ControlAssembly="System.Web, ..." 
    ControlClass="System.Web.UI.WebControls.SiteMapDataSource"> 
     <Property Name="ID">QuickLaunchSiteMap</Property> 
     <Property Name="SiteMapProvider">SPSiteMapProvider</Property> 
     <Property Name="ShowStartingNode">False</Property>
    </Control>
    这个Control的id要和你要替换的id是一样的才可以。
     
    自定义Default.master

    我们可以使用SPD来定制母版页,母版页和其他的Site Page的原理是一样的,你定制过后就会被存到内容数
    据库中。所以我们不要去文件目录下直接修改default.master文件,修改了也是没有用的。

    下面我们就自定义一个母版页实现简单的换肤功能,在elements.xml中定义如下:

    <Module Name="MasterPages" List="116" Url="_catalogs/masterpage">
    <File Url="OurCustom.master" Type="GhostableInLibrary" />
    </Module>

    Url:"_catalogs/masterpage"是母版页的相对路径。

    Type:"GhostableInLibrary" 会在文档库中存储该母版页。

    List:属性代表不同的列表类型,下表是MOSS中已经定义的,微软建议我们自定义的最好大于10000,以避免
    和已定义的冲突。

    ID Description
    100 Generic list
    101 Document library
    102 Survey
    103 Links list
    104 Announcements list
    105 Contacts list
    106 Events list
    107 Tasks list
    108 Discussion board
    109 Picture library
    110 Data sources
    111 Site template gallery
    112 UserInformation
    113 Web Part gallery
    114 List template gallery
    115 XML Form library
    116 MasterPageCatalog
    117 NoCodeWorkflows
    118 WorkflowProcess
    119 WebPageLibrary
    120 Custom grid for a list
    130 DataConnectionLibrary
    140 WorkflowHistory
    150 GanttTasks
    200 Meeting Series list
    201 Meeting Agenda list
    202 Meeting Attendees list
    204 Meeting Decisions list
    207 Meeting Objectives list
    210 Meeting text box
    211 Meeting Things To Bring list
    212 Meeting Workspace Pages list
    300 Portal Sites list.
    301 Posts
    302 Comments
    303 Categories
    1100 Issue tracking
    1200 AdminTasks
    2002 Personal document library
    2003 Private document library

    Page的MasterPageFile属性指定使用的母版页,MOSS中的母版页默认提供了一些token,主要有动态tokens ("~masterurl/default.master""~masterurl/custom.master") 和静态 tokens ("~site/default
    .master"
    and "~sitecollection/default.master"),说明如下:

    Dynamic token "~masterurl/default.master"

    可以通过SPWeb的MasterUrl属性来指定网站的母版页的URL,即指定page中的MasterPageFile,页面的<%@
    Page MasterPageFile="~masterurl\default.master"%>
    中的"~masterurl/default.master"在运
    行时将会被
    SPWeb的MasterUrl属性取代

    Dynamic token "~masterurl/custom.master"

    与上面的类似,他是通过SPWeb的CustomMasterUrl属性来指定的。

    Static tokens "~site/default.master""~sitecollection/default.master"

    如果你的内容页在http://siteColl/subsite1/subsite2/default.aspx,你使用了静态tokens"~sitecollection/mypage.master", 你内容页使用的母版页在这个位置 http://siteColl/
    mypage.master
    . 如果你用的tokens 是"~site/mypage.master", 你的母版页就在这个位置 http://siteColl/subsite1/subsite2/mypage.master.

    注意:MasterUrl 和 CustomMasterUrl 默认都是这个值"/_catalogs/masterpage/default.master" ,如果你要
    改变的话,要两个都改变,必须一致才行。

    下面我们就来实现动态设定母版页,由于我们定义的是站点级的,而站点中的每个子站点都是应用的自己独立
    的一个master,所以我们使用递归来替换所有的站点的母版页代码如下:

    protected void btnApplyOurCustomMaster_Click(object sender, EventArgs e) 
    {
      SPWeb site = SPContext.Current.Site.RootWeb
      string MasterUrlPath = site.ServerRelativeUrl;
      if (!MasterUrlPath.EndsWith(@"/"))
        MasterUrlPath += @"/";
      MasterUrlPath += @"_catalogs/masterpage/OurCustom.master";
      ApplyCustomBrand(MasterUrlPath, site);
    }
    
    protected void ApplyOurCustomMaster(string MasterUrlPath, SPWeb site) {
      site.MasterUrl = MasterUrlPath;
      site.Update();
      foreach (SPWeb child in site.Webs) {
        ApplyCustomBrand(MasterUrlPath, child);
      }
    }
    
    下图是前后的效果:
    06 
    
     
    作者:生鱼片
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    开源WebGIS实施方案(五):基于SLD实现图层符号化及其应用
    开源WebGIS实施方案(四):GeoServer发布PostGIS数据
    开源WebGIS实施方案(三):Shapefile数据导入到PostGIS
    jdbcType与javaType的对应关系
    关于fastjson的一个坑:输出json时,bean对象属性首字母默认被小写
    TortoiseSVN本地版本控制管理
    ArcGIS“一个或多个ActiveX控件无法显示...”问题的解决方案
    JavaWeb学习系列——第一个JavaWeb程序
    ArcGIS提取影像边界
    调皮的MySQL服务 请你不要再躲猫猫
  • 原文地址:https://www.cnblogs.com/carysun/p/master.html
Copyright © 2020-2023  润新知