1

WSS 3.0 サイトのマスター ページ (つまり、default.master) をカスタマイズする方法を知っている人はいますか? 実際、マスター ページをカスタマイズする方法 (つまり、SharePoint Designer またはテキスト エディターを使用) は既に知っていますが、カスタマイズしたマスター ページを使用するように WSS 3.0 に指示する方法を知りたいと思っています。

カスタマイズしたバージョンで default.master の名前を変更しましたが、それは機能しますが、すべての WSS サイトに対して設定されます。サイト コレクション A のマスター ページのバージョン A と、他のサイト コレクションの別のマスター ページを使用できるようにしたいと考えています。

MOSS 2007 について言及しているわけではないことに注意してください。MOSS 2007 のマスター ページを設定する方法は既に知っています。

ありがとう。

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 { public class 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 に答える