次の方法で共有


カスタム フィールド レンダリングのパターン

カスタム フィールドのレンダリング方法を詳細に制御する方法は数多くあります。このトピックではいくつかの代表的なパターンを説明し、それぞれのニーズに合わせて変更する方法を示します。

注意

このトピックは、カスタム フィールドおよびその値のレンダリングについて説明します。[サイト内の新しい列]、[サイト内の列の変更]、[列の作成]、および [列の変更] にあるカスタム フィールド型の可変プロパティのレンダリングについて説明するものではありません。カスタム フィールド型の可変のフィールド プロパティのレンダリングについては、「ユーザー設定フィールド型のプロパティのレンダリング」を参照してください。

RenderPattern のみの使用

カスタム フィールド型をレンダリングする最も簡単な方法では、フィールド レンダリング コントロールまたはフィールド レンダリング テンプレートは使用しません (下記参照)。代わりに、オンリスト ビュー、およびすべての制御モード(新規、編集、および表示)でのフィールドのレンダリングはフィールド定義で定義された RenderPattern を使用して行われます。ただしこの方法では、検証ロジックスがクリプトで実行可能なものに限られます。このような理由から、RenderPatterns は、検証が問題にならないオンリスト ビューおよび表示モードでのレンダリングにのみ適していると言えます。

新規モードおよび編集モードでは、通常はフィールド レンダリング コントロールと、1 つ以上のフィールド レンダリング テンプレートを作成する必要があります。

レンダリング コントロールとテンプレート システム

すべてのフィールド レンダリング コントロールには、少なくとも 1 つのフィールド レンダリング テンプレートが関連付けられます。この関連付けは、フィールド レンダリング コントロールのプロパティの 1 つに、フィールド レンダリング テンプレートの ID への参照を格納することで設定されます。レンダリング時には、Windows SharePoint Services 3.0 が C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES にある .ascx (Web アプリケーションの起動時にすべて読み込まれる) で宣言されているレンダリング テンプレートすべての ID を検索して、必要なテンプレートを参照します。レンダリング コントロールの CreateChildControls メソッドは、多くの場合フィールド レンダリングの最終仕上げにすぎず、レンダリング作業のほとんどはテンプレートによって行われます。

最も一般的なパターン

カスタム フィールド型を開発する際、最もよく使用するフィールド レンダリング構成のパターンには、次の特徴があります。

  • (fldtypes*.xml ファイルの) 定義にリスト ビューおよび表示モードでフィールドをレンダリングする RenderPattern の DisplayPattern 型が含まれます。

  • レンダリング コントロールがあり、1 つだけのレンダリング テンプレートに関連付けられています。このコントロールはその TemplateName プロパティを使用してテンプレートの ID を指定します。

  • この 1 つのテンプレートを使用して、新規および編集モードでの、フィールド レンダリングのほとんどが実行されます。

  • レンダリング コントロールの CreateChildControls メソッドが、新規モードでレンダリング コントロールの子コントロールにデフォルト値を割り当てます。このメソッドは、編集モードでは、子コントとロールにフィールドの現在の値を割り当てます。(表示モードでは何も行いません。) また、子 Label コントロールに CSS クラスを割り当てるなど、レンダリングのその他の最終仕上げも行います。

  • 検証ロジックは、フィールド レンダリング コントロールの ValidateIsValid、および ErrorMessage の各メンバ、および基盤となるとなるフィールド型の GetValidatedString メソッドによって実行されます。(ValidateCreateChildControls によって呼び出される場合があります。)

より複雑なパターン

このセクションでは、カスタム フィールド型で必要となった場合に使用できる、標準的なパターンとは違う方法を説明します。

表示モードでのテンプレートの使用

表示モードでも、RenderPattern ではなくフィールド レンダリング テンプレートを使用した方が良い場合があります。たとえば、表示モードでの概観はほとんど同じカスタム フィールド型がいくつも存在する場合があります。1 つの fldtypes*.xml から別のファイルに (またはファイル内で) コピーして貼り付けない限り、RenderPattern は多数のフィールド型間で再利用することは困難です。ただし、この方法では、RenderPattern への変更が必要になった場合、すべてのコピー先を検索する必要があります。このため、多くの異なるレンダリング コントロールで参照可能な、フィールド レンダリング テンプレートを使用する方が簡単です。

同じテンプレートを 3 つの制御モードすべてで使用できるケースはあまりありません。新規モードおよび編集モードでは、編集可能なテキスト ボックス、チェック ボックス、ラジオ ボタン、ドロップダウン リストなど、対話式コントロールが必要です。しかし表示モードでは、通常 Label または Literal コントロール、またはその他の静的表示コントロールだけが必要です。このため、多くの場合、表示モード用に別のレンダリング テンプレートを作成する必要があります。このテンプレートは、DisplayTemplateName プロパティに (ID で) 指定します。

任意のコンテキストでフィールドのレンダリングに実際に使用されるレンダリング テンプレートは、レンダリング コントロールの ControlTemplate プロパティで返されるテンプレートです。このプロパティの get アクセサは、次の判断基準を使用して、レンダリング コントロールに関連付けられたレンダリング テンプレートの中から選択します。

  • 現在の HTTP コンテキスト

  • 制御モード

  • フィールドが必須かどうか

  • フィールドが数値の場合、パーセンテージとしてレンダリングするかどうか

  • リスト アイテムがフォルダかどうか

このプロパティを上書きし、get アクセサで制御モードをチェックして、表示モードの場合は DisplayTemplate を返すようにすることができます (明示的に他のテンプレートに設定されていない限り、DisplayTemplate は、DisplayTemplateName で識別されるテンプレートを返します)。ControlTemplate の get アクセサに他の決定ロジックが必要でない限り、新規モードまたは編集モードでは、基本プロパティの get アクセサを呼び出すようにします。

注意

表示モードでのレンダリング テンプレートを指定する別の方法は、表示モードでは、CreateChildControls メソッドを使用して DisplayTemplateNameTemplateName に割り当てる方法です。ControlTemplate は上書きされていない限り Template を返し、その get アクセサは、上書きされていない限り TemplateName で識別されるテンプレートを返します。 このアプローチの考えられる弱点は、デバッグ目的でオブジェクト モデルの ControlTemplate の値をチェックするときなど、フィールドがレンダリングされていないコンテキストではコードが実行されない点です。

複数のレンダリング テンプレートを必要とするその他の状況

TemplateTemplateNameDisplayTemplate、および DisplayTemplateName に加え、AlternateTemplateAlternateTemplateName も使用できます。

メインのテンプレートで対応できないページ コンテキストでカスタム フィールドをレンダリングするには、代替のテンプレートを使用します。以下にいくつかの例を示します。

  • あるフィールドが一部のリストでは必須で他のリストでは必須でない場合、特定のリストでは、フィールドが必須であることを示すインジケータ (赤いアスタリスクなど) を付加してあること以外はメインのテンプレートと同じ代替テンプレートを使用できます。次に、ControlTemplate の get アクセサを使用して、そのフィールドの Required プロパティをチェックし、必要に応じて Template または AlternateTemplate のどちらかを返すようにします。

  • ほぼ同じようにレンダリングする多数のカスタム フィールド型を使用する予定の場合、新規モードと編集モードで使用するテンプレートを別々に作成すると、コードをより効率的に再利用できる可能性があります。新規モードのテンプレートでは子オブジェクトにデフォルト値を割り当て、編集モードのテンプレートは現在の値を割り当てます。これにより、1 つ 1 つのカスタム フィールド型クラスの CreateChildControls メソッドで割り当てロジックを繰り返す必要がなくなります。この場合も、ControlTemplate の get アクセサが、制御モードに基づいて使用するテンプレートを決定します。

  • 代替テンプレートを使用すると、特定の Web サイト、サイト コレクション、または Web アプリケーションでフィールドの特別なレンダリングが必要な場合にも役立ちます。たとえば、色覚異常などの視覚障碍のあるユーザー向けにデザインされた Web サイトがあるとします。ControlTemplate の get アクセサが RenderContext の値をチェックして特別なテンプレートが必要かどうかを判断し、適切なテンプレートを返します。

  • SPFieldNumber から継承したカスタム フィールド型を、いつもではないが時々パーセンテージとしてレンダリングする必要がある場合、2 つの異なるレンダリング テンプレートを用意することで開発時間を大幅に節約できます。SPFieldNumber.ShowAsPercentage プロパティの値に応答するように、ControlTemplate の get アクセサを上書きします。

テンプレートの関連付けの追加

BaseFieldControl から派生させたフィールド レンダリング コントロールに、さらにテンプレートを追加して関連付けることができます。追加するときは、次のパターンに従うことをお勧めします。

  • ITemplate の新規プライベート フィールドを作成します。

  • そのプライベート フィールドを囲むラッパーとして新しいパブリック プロパティを作成し、circumstanceTemplate などの名前を付けます。ここで、circumstance は、テンプレートを使用する状況を示します。

  • String を返す 2 つ目のパブリック プロパティを作成し、circumstanceTemplateName という名前を付けます。

  • circumstanceTemplate の get アクセサは、前者が null でない場合にのみプライベート フィールドを返します。null 以外の場合、circumstanceTemplateName によって指定された ITemplate を返します。これには、GetTemplateByName() メソッドを使用します。

  • circumstance が true の場合は常に circumstanceTemplate を返すよう、ControlTemplate の get アクセサを上書きします。

Web カスタム コントロールのテンプレートとしての使用

カスタム フィールドのレンダリング コントロールは、次の 2 つの特別な ITemplate プロパティも継承します。

CustomTemplateCustomAlternateTemplate です。これら 2 つのプロパティには、[PersistenceMode(PersistenceMode.InnerProperty)] 属性でマークが付けられています。これは、これらのプロパティが返す ITemplate オブジェクトがコンパイルされていて、フィールド レンダリング コントロール内にネストされたタグとして存在することを意味します。事前にコンパイルされたテンプレートを使用すると、いくつかの利点があります。たとえば、Microsoft Office SharePoint Designer 2007 または Microsoft Visual Studio 2005 などのビジュアル デザイナで、デザイナのツールボックスからドラッグ アンド ドロップしてページに追加できます。ただし、欠点もあります。Web ユーザー コントロールおよびカスタム Web コントロールの詳細については、「Web User Controls and Web Custom Controls」および「PersistenceModeAttribute」を参照してください。

モバイル デバイス向けフィールド レンダリングとコンピュータ向けフィールド レンダリングの違い

Windows SharePoint Services 3.0 では、モバイル デバイス向けのカスタム フィールド レンダリング コントロールを使用したフィールド レンダリングは、コンピュータ向けカスタム フィールド レンダリンググ コントロールを使用したフィールド レンダリングに似ています。ただし、次の違いに注意してください。

See Also

タスク

[ウォークスルー] ユーザー設定フィールド型を作成する

[ウォークスルー] モバイル ページのカスタム フィールド レンダリング コントロールを作成する

概念

ユーザー設定フィールド型

ユーザー設定フィールドクラス

ユーザー設定フィールド データ入力規則

ユーザー設定フィールド値クラス

ユーザー設定フィールド型の定義

ユーザー設定フィールド型のプロパティのレンダリング

フィール型プロパティ用エディタ コントロール

フィールド レンダリング コントロール

フィールド レンダリング テンプレート

モバイル ページのレンダリング システム