【问题标题】:Customizing default.master in WSS 3.0在 WSS 3.0 中自定义 default.master
【发布时间】:2009-03-18 18:47:27
【问题描述】:

有谁知道如何为 WSS 3.0 站点自定义母版页(即 default.master)?实际上,我已经知道如何自定义母版页(即通过 SharePoint Designer 或文本编辑器),我更感兴趣的是学习如何告诉 WSS 3.0 使用我自定义的母版页。

我已经用我的自定义版本重命名了 default.master 并且可以正常工作,但是它为所有 WSS 站点设置了它。我希望能够为网站集 A 使用版本 A 的母版页,并为其他网站集使用单独的母版页。

注意,我不是指 MOSS 2007。我已经知道如何为 MOSS 2007 设置母版页。不过,我似乎不知道如何为 WSS 3.0 设置。

谢谢。

【问题讨论】:

    标签: sharepoint wss


    【解决方案1】:

    WSS 页面使用母版页,就像常规 Web 应用程序一样。但是,如果 MasterPageFile 属性是一个标记,则该值设置为“~default.master”。在页面的 PreInit 方法中,此标记将替换为对母版页的实际引用。

    您可以将 ~default.master 的值更改为您喜欢的任何值。但更好的解决方案是做与 SharePoint 相同类型的事情。

    我向我的 SharePoint 网站添加了一个 HttpHandler。该处理程序附加到 PreRequestHandlerExecute 方法,并在 SharePoint 开始呈现页面之前更改母版页文件属性的值。

    在 web.config 的 httpModules 部分添加一行,如下所示:

    然后像这样创建一个类:

    命名空间 MyClassLibrary.Utility { 公共类 MasterPageHttpModule : IHttpModule { 公共无效初始化(HttpApplication上下文) { context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); }

        void context_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            bool useCustomMasterPages = Convert.ToBoolean(ConfigurationManager.AppSettings["ShowCustomMasterPages"].ToString());
            if (useCustomMasterPages)
            {
                Page page = HttpContext.Current.CurrentHandler as Page;
                if (page != null)
                {
                    page.PreInit += new EventHandler(page_PreInit);
                }
            }
        }
    
        void page_PreInit(object sender, EventArgs e)
        {
            bool useThreeColumnMaster = Convert.ToBoolean(ConfigurationManager.AppSettings["UseThreeColumnMasterOnDefaultPage"].ToString());
    
            try
            {
                Page page = sender as Page;
                if (page != null && SPContext.Current != null)
                {
                    string url = page.Request.Url.AbsolutePath.ToLower();
                    if (url.IndexOf("/public/") > -1)
                    {
                        if (url.IndexOf("sitemap.aspx") == -1)
                        {
                            page.MasterPageFile = "~/_catalogs/masterpage/edge_con.master";
                        }
                        else
                        {
                            page.MasterPageFile = "";
                        }
                    }
                    else if (url.IndexOf("default.aspx") > -1)
                    {
                        if (useThreeColumnMaster)
                        {
                            page.MasterPageFile = "~/_catalogs/masterpage/edge_con.master";
                        }
                        else
                        {
                            page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                        }
                    }
                    else if (url.IndexOf("sitemap.aspx") > -1)
                    {
                        //
                        //  Sitemap pages should not have a master page
                        //
                        page.MasterPageFile = "";
                        page.Controls.Clear();
                    }
                    else if (url.IndexOf("/admin/") > -1)
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                    }
                    else if (url.IndexOf("/member/") > -1)
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                    }
                    else if (url.IndexOf("/supplier/") > -1)
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                    }
                    else if (page.MasterPageFile == "~masterurl/default.master")
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                    }
                }
            }
            catch (Exception exception)
            {
                LogWriter logWriter = new LogWriter();
                logWriter.WriteToLog("Could  not set master page: " + exception.Message, LogType.MasterPage, DateTime.Now);
            }
        }
    
        public void Dispose()
        {
        }
    }
    

    }

    现在您正在动态选择主页面。

    【讨论】:

      【解决方案2】:

      您需要更改代表站点的 SPWeb 对象的 MasterUrl 属性。执行此操作的一个好方法是创建一个 SharePoint 功能,该功能在激活时设置属性,而在停用时恢复原始值。 Feature.xml 可能如下所示:

      <?xml version="1.0" encoding="utf-8"?>
      <Feature  Id="8651CC66-FEB1-4255-B7E9-0DFE24367DAB"
                Title="My Master Page"
                Scope="Web"              
                SolutionId="06D3B01F-0C26-457a-BFA5-A1B0BC8D4225"
                ReceiverAssembly="MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9e95445247029289"
                ReceiverClass="MyFeatureReceiver"
                xmlns="http://schemas.microsoft.com/sharepoint/">
        <ElementManifests>
          <ElementManifest Location="Masterpage.xml"/>
          <ElementFile Location="my.master"/>
        </ElementManifests>
        <Properties>
          <Property Key="MyMaster" Value="my.master" />
        </Properties>
      </Feature>
      

      文件 Masterpage.xml 将您的母版页上传到图库:

       <?xml version="1.0" encoding="utf-8" ?>
       <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
         <Module Name="UploadMaster" Url="_catalogs/masterpage" >
           <File Url="my.master" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
          </Module>
       </Elements>
      

      将此功能与包含 MyFeatureReceiver 类的 MyAssembly.dll 一起包含在 WSP 解决方案中,如下所示:

      public class MyFeatureReceiver : SPFeatureReceiver
      {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
          SPWeb web = (SPWeb)properties.Feature.Parent;
          web.MasterUrl = properties.Definition.Properties["MyMaster"].Value;
          web.Update();      
        }
      
        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
          SPWeb web = (SPWeb)properties.Feature.Parent;
          web.MasterUrl = "default.master";
          web.Update();      
        }
      
        public override void FeatureInstalled(SPFeatureReceiverProperties properties)
        {
        }
      
        public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
        {
        }
      }
      

      最后,部署解决方案并在您的站点上激活该功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        相关资源
        最近更新 更多