フィールド レンダリング テンプレートを作成する
最終更新日: 2010年4月4日
適用対象: SharePoint Foundation 2010
この記事の内容
レンダリング テンプレートとレンダリング コントロールの関係
レンダリング テンプレート システム
フィールド レンダリング構成
複数のレンダリング テンプレートを必要とするシナリオ
テンプレートの関連付けを追加
Web カスタム コントロールのテンプレートとしての使用
フィールド レンダリング テンプレートとは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\controltemplates フォルダーにある .ascx ファイルの RenderingTemplate 要素として定義されている RenderingTemplate オブジェクトのことです。レンダリング コントロール クラスの CreateChildControls メソッドと共に使用され、新規モード、編集モード、または表示モードでフィールドをレンダリングします。
レンダリング テンプレートとレンダリング コントロールの関係
RenderingTemplate オブジェクトとは、一種の Control-ITemplate オブジェクトのことです。これは Control から派生し、新しいメンバーを 1 つだけ追加します。そのメンバーとは、ITemplate オブジェクトを保持する Template プロパティです。これにより、rendering control (TemplateBasedControl から派生) は ITemplate オブジェクトを間接的に参照できるようになります。この参照は、レンダリング テンプレートの ID プロパティ (ID) で RenderingTemplate オブジェクトを参照することによって実現します。レンダリング コントロールは、これを実現するために、その複数の String プロパティの 1 つ以上 (TemplateName など) を使用します。それらのプロパティがレンダリング テンプレートの ID を保持できます。
レンダリング テンプレート システム
すべてのフィールド レンダリング コントロールには、少なくとも 1 つの関連するフィールド レンダリング テンプレートが含まれています。SharePoint Foundation では、表示の際に %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES にある .ascx ファイルで宣言されているすべてのコントロールの ID を検索することにより、必要なテンプレートを検索します (Web アプリケーション開始時にこれらのすべてが読み込まれます)。
フィールド レンダリング構成
ユーザー設定フィールドの種類を作成する際に最もよく使用するフィールド レンダリング構成には、以下のような特徴があります。
レンダリング コントロールが 2 つのレンダリング テンプレートに関連付けられており、コントロールの TemplateName プロパティおよび DisplayTemplateName プロパティを使用してその ID を指定します。
一方のテンプレートは、新規モードおよび編集モードでほとんどのフィールド レンダリングを提供します。もう一方のテンプレートは、表示モードでほとんどのフィールド レンダリングを提供します。
レンダリング コントロールの CreateChildControls メソッドを使用すると、新規モードでレンダリング コントロールの子コントロールに既定値が割り当てられます。また、編集モードおよび表示モードで子コントロールにフィールドの現在の値が割り当てられます。そのほかに、子コントロールの Label に CSS クラスを割り当てるなどの "仕上げ" のレンダリング作業が行われます。
入力規則ロジックは、フィールド レンダリング コントロールの Validate、IsValid、ErrorMessage の各メンバーと、その基礎となるフィールドの種類の GetValidatedString メソッドにより実装されます。(Validate は、CreateChildControls により呼び出される場合があります。)
BaseFieldControl は、TemplateBasedControl および FieldMetadata から、複数のレンダリング テンプレートにリンクし、レンダリング コンテキストに基づいてそれらを切り替えることができるメンバーを継承します。
複数のレンダリング テンプレートを必要とするシナリオ
Template、TemplateName、DisplayTemplate、および DisplayTemplateName のほかに、AlternateTemplate、AlternateTemplateName も操作できます。
メインのテンプレートで対応できないページ コンテキストでカスタム フィールドをレンダリングするには、代替のテンプレートを使用します。以下にいくつかの例を示します。
あるフィールドが一部のリストでは必須で他のリストでは必須でない場合、特定のリストでは、フィールドが必須であることを示すインジケーター (赤いアスタリスクなど) を付加してあること以外はメインのテンプレートと同じ代替テンプレートを使用できます。次に、ControlTemplate の get アクセサーを使用して、そのフィールドの Required プロパティをチェックし、必要に応じて Template または AlternateTemplate のどちらかを返すようにします。
ほぼ同じようにレンダリングする多数のカスタム フィールド型を使用する予定の場合、新規モードと編集モードで使用するテンプレートを別々に作成すると、コードをより効率的に再利用できる可能性があります。新規モードのテンプレートでは子オブジェクトに既定値を割り当て、編集モードのテンプレートは現在の値を割り当てます。これにより、1 つ 1 つのカスタム フィールド型クラスの CreateChildControls メソッドで割り当てロジックを繰り返す必要がなくなります。この場合も、ControlTemplate の get アクセサーが、制御モードに基づいて使用するテンプレートを決定します。
代替テンプレートを使用すると、特定の Web サイト、サイト コレクション、または Web アプリケーションでフィールドの特別なレンダリングが必要な場合にも役立ちます。たとえば、色覚異常などの視覚障碍のあるユーザー向けにデザインされた Web サイトがあるとします。ControlTemplate の get アクセサーが RenderContext の値をチェックして特別なテンプレートが必要かどうかを判断し、適切なテンプレートを返します。
SPFieldNumber から継承したカスタム フィールド型を、いつもではないが時々パーセンテージとしてレンダリングする必要がある場合、2 つの異なるレンダリング テンプレートを用意することで開発時間を大幅に節約できます。SPFieldNumber.ShowAsPercentage プロパティの値に応答するように、ControlTemplate の get アクセサーをオーバーライドします。
テンプレートの関連付けを追加
BaseFieldControl から派生させたフィールド レンダリング コントロールに、さらにテンプレートを追加して関連付けることができます。追加するときは、次のパターンに従うことをお勧めします。
新しいプライベート フィールド型 ITemplate を作成します。
そのプライベート フィールドを囲むラッパーとして新しいパブリック プロパティを作成し、環境Template などの名前を付けます。ここで、環境は、テンプレートを使用する状況を示します。
String を返す 2 つ目のパブリック プロパティを作成し、環境TemplateName という名前を付けます。
環境Template の get アクセサーは、後者が null でない場合にのみプライベート フィールドを返します。それ以外の場合、環境TemplateName によって指定された ITemplate を返します。これには、GetTemplateByName() メソッドを使用します。
環境が true の場合に必ず環境Template を返すように、ControlTemplate の get アクセサーをオーバーライドします。
Web カスタム コントロールのテンプレートとしての使用
ユーザー設定フィールドのレンダリング コントロールも、2 つの特別な ITemplate プロパティ、CustomTemplate および CustomAlternateTemplate を継承します。これら 2 つのプロパティには、[PersistenceMode(PersistenceMode.InnerProperty)] 属性でマークが付けられています。これは、これらのプロパティが返す ITemplate オブジェクトがコンパイルされていて、フィールド レンダリング コントロール内にネストされたタグとして存在することを意味します。事前にコンパイルされたテンプレートを使用すると、いくつかの利点があります。たとえば、SharePoint Designer、Visual Studio などのビジュアル デザイナーで、デザイナーのツールボックスからドラッグ アンド ドロップしてページに追加できます。ただし、欠点もあります。Web ユーザー コントロールおよびカスタム Web コントロールの詳細については、「Web User Controls and Web Custom Controls」および「PersistenceModeAttribute」を参照してください。