1

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

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

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

谢谢。

4

2 回答 2

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)
  {
  }
}

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

于 2009-03-19T18:29:36.620 回答
2

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

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

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

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

然后创建一个这样的类:

命名空间 MyClassLibrary.Utility { 公共类 MasterPageHttpModule : IHttpModule { public void Init(HttpApplication context) { 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()
    {
    }
}

}

现在您正在动态选择母版页。

于 2009-03-18T19:44:36.957 回答