SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NETマスターページの小技

Webサイトのデザインやレイアウトの効率的な管理テクニック

マスターページのContentPlaceHolderコントロールでデフォルトコンテンツを提供しよう

 マスターページでは、どのコンテンツページでも変化しないマークアップと共に、ページ単位でカスタマイズ可能な領域も定義します。コンテンツページごとにカスタマイズ可能な領域を指示するにはContentPlaceHolderコントロールを使います。マスターページにはこのコントロールをいくつでも含めることができます。サイトに新しいコンテンツページを追加すると、マスターページで定義した各ContentPlaceHolderのコンテンツページにコンテンツコントロールが追加され、(ページ開発者が)各領域にページ固有のコンテンツを定義するよう促されます。

 実は、これらのコンテンツコントロールをコンテンツページで使わなくてもかまいません。コンテンツページでContentPlaceHolderのコンテンツコントロールを定義しなければならないのは、カスタムコンテンツを提供する場合だけです。さらに、マスターページ内のContentPlaceHolderコントロールにもコンテンツを含めることができ、それをオーバーライドするコンテンツコントロールをコンテンツページで提供しなければ、それがデフォルトのコンテンツとして使用されます。

 上の最後の説明は「コンテンツ」という語が9回も出てくるので少し分かりにくいかもしれません。簡単な例で説明しましょう。今、マスターページにFirstContentPlaceHolderSecondContentPlaceHolderという2つのContentPlaceHolderコントロールがあるものとします。通常、ContentPlaceHolderコントロールは、次のように内部にコンテンツを指定しないで定義します。

<%@ Master Language="VB" CodeFile="Site.master.vb" Inherits="Site" %> 
... Some markup removed for brevity ... 

<asp:ContentPlaceHolder id="FirstContentPlaceHolder" runat="server">

</asp:ContentPlaceHolder>

<p>Blah blah blah</p> 

<asp:ContentPlaceHolder id="SecondContentPlaceHolder" runat="server">

</asp:ContentPlaceHolder>

 つまり、コンテンツページで2つのコンテンツコントロールを定義し、そこでこれらの領域についてページ固有のコンテンツを定義するわけです。例えば、コンテンツページに次のマークアップが含まれているものとします。

<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" 
AutoEventWireup="false" CodeFile="Default.aspx.vb"
Inherits="_Default" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="FirstContentPlaceHolder" Runat="Server"> 
   I have nothing interesting to say. 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="SecondContentPlaceHolder" Runat="Server"> 
   I should start a blog! 
</asp:Content> 

 Content1Content2の2つのコンテンツコントロールがあり、そこで定義されたコンテンツが、それぞれマスターページのFirstContentPlaceHolderSecondContentPlaceHolderというContentPlaceHolderコントロールに注入されることに注意してください。このコンテンツページをブラウザで表示すると、図1のようになります。

図1
図1

 しかし、マスターページに手を加えれば、これら2つのContentPlaceHolderのデフォルトコンテンツを定義できます。例えば、変更後のマスターページは次のようになります。

<%@ Master Language="VB" CodeFile="Site.master.vb" Inherits="Site" %> 
... Some markup removed for brevity ...

<asp:ContentPlaceHolder id="FirstContentPlaceHolder" runat="server"> 
   <h1>This is the first content place holder!</h1>
</asp:ContentPlaceHolder> 

<p>Blah blah blah</p> 

<asp:ContentPlaceHolder id="SecondContentPlaceHolder" runat="server"> 
   <h1>This is the second content place holder!</h1>
</asp:ContentPlaceHolder> 

 このコンテンツページをブラウザで再度表示すると、上と同じ画面が表示されます。しかし、いずれかのコンテンツコントロールをコンテンツページから削除すると、新しい表示は対応するContentPlaceHolderで定義されているデフォルトコンテンツに置き換えられます。例えば、SecondContentPlaceHolderというContentPlaceHolderを参照するContent2コンテンツコントロールを削除した場合、コンテンツページのマークアップは次のようになります。

<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master"
AutoEventWireup="false" CodeFile="Default.aspx.vb"
Inherits="_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="FirstContentPlaceHolder" Runat="Server"> 
   I have nothing interesting to say. 
</asp:Content> 

 こうした上で同じページをブラウザで開くと、コンテンツページで定義したコンテンツ("I have nothing interesting to say")がページの最初に表示され、SecondContentPlaceHolderContentPlaceHolderについてはデフォルトのマークアップ("This is the second content place holder!")が表示されます。このコンテンツページをブラウザで表示すると、図2のようになります。

図2
図2

 ContentPlaceHolderコントロールのこのデフォルトマークアップ機能は、サイトのある特定の領域のコンテンツがほぼすべてのページで変化しないのに、その同じ領域のコンテンツを他の1ページか2ページでカスタマイズしなければならないような状況で役に立ちます。この場合は次の作業を行います。

  1. マスターページにContentPlaceHolderを追加することで、大部分のページでは変化しないが一部のページでカスタマイズしなければならない領域を指示する。
  2. 大部分のページに共通するマークアップをContentPlaceHolder内に入力する。
  3. 同じデフォルトコンテンツを使用するASP.NETページで、対応するコンテンツコントロールをページのマークアップから削除する。
  4. 固有のコンテンツを持つページについて、対応するコンテンツコントロールを作成し、その内部に固有のコンテンツを定義する。

 このテクニックの詳細については、「Multiple ContentPlaceHolders and Default Content」というチュートリアルを参照ください。これはThe Official Microsoft ASP.NET Siteで私が公開している10件のマスターページに関するチュートリアル(Master Page Tutorials)の1つです。

次のページ
リンクやイメージのURLを指定するときはWebコントロールとチルダ文字(~)を使おう

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Mitchell(Scott Mitchell)

http://www.4guysfromrolla.com/ScottMitchell.shtml

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4273 2009/08/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー