asp.NetModelメタデータ学習二

6304 ワード

3.IMetadataAwareインタフェース
Modelメタデータのカスタム属性を設定するAdditionalMetadataAttributeプロパティは、最終的に生成されたModelメタデータを自由にカスタマイズできる非常に重要なIMetadataAwareインタフェースを実現します.このインタフェースには唯一の方法しかなく,パラメータとしてのModelMetadataオブジェクトは自由にカスタマイズできるModelメタデータを表す.Modelメタデータを表すModelMetadataオブジェクトが作成されると、前編の投稿に記載されている一連の注釈プロパティが抽出されて初期化されます.
        public interface IMetadataAware { void OnMetadataCreated(ModelMetadata metadata); }
続いてASP.NET MVCは、アプリケーションのMetadataAwareプロパティ、すなわちIMetadataAwareインタフェースのプロパティを取得し、それらのOnMetadataCreatedメソッドを呼び出します.MetadataAwareプロパティでは、追加のメタデータプロパティを追加するだけでなく、データ注記プロパティで初期化された関連プロパティを変更することもできます.ASP.NET MVCは2つの具体的なMetadataAware特性を定義し、1つはAdditionalMetadataAttribute、1つはAllowHtmlAttributeである.安全上の理由から、ASP.NET MVCは、Modelバインド処理中に要求データを検証し、Htmlタグが含まれていないことを確認します.ModelMetadataのRequestValidationプロパティでは、リクエスト検証をオンまたはオフにするかどうかを制御します.デフォルトではhtmlタグのリクエスト検証をオンにします.AllowHtmlAttributeがデータ型またはそのデータメンバーに適用されている場合は、ターゲット要素にバインドされた元のコンテンツにhtmlタグを含めることができます.つまり、リクエスト検証を無視します.無視とはメソッドにRequestValidation属性値をfalseとして設定することであり,OnMetadataCreatedメソッドのパラメータがModelMetadataオブジェクトであることを覚えているので実現は便利である.
Modelメタデータの主な役割は、HtmlHelperに定義されたテンプレートメソッドにhtmlの生成を支援するメタデータ情報を提供することであり、これらのテンプレートメソッドは、表示モードや編集モードなどの表示対象データのモードのみを提供するが、具体的にどのようなhtmlページを生成するかは、採用されたテンプレートによって決定され、次にこれを学習する.
4.定義済みテンプレート
ASP.NET内部には一連の事前定義テンプレートが定義されており、現在のレンダリングモード(すなわち、モードの表示または編集)と対応するModelメタデータに基づいて、Modelオブジェクトまたはそのメンバーを表示するテンプレートメソッドをViewで呼び出すと、現在のレンダリングモード(すなわち、モードの表示または編集)に基づいて特定のテンプレート(カスタムテンプレートまたは事前定義テンプレート)が取得されます.Modelには表示と編集の2つのプレゼンテーションモードがあるため、前述した内部定義テンプレートも2つの基本的なタイプに分けられている.
(1)EmailAddress
Email Addressテンプレートは、Emailアドレスを表す文字列タイプのデータメンバーに特化しており、ターゲット要素はhref属性が持つ「mailto:」接頭辞のリンクとして表示されます.このテンプレートはEmailアドレスの表示にのみ使用されるため、表示モードでのみ有効であるか、MVCは表示モードベースのEmailAddressテンプレートのみを定義しています.次のコードでは、FoobarにUIHintAttributeプロパティを適用してテンプレート名を「EmailAddress」に設定します.
[UIHint("EmailAddress")] public string Foobar{get;set;}

<a href="mailto:[email protected]">[email protected]</a>
HtmlHelperのテンプレートメソッドを呼び出してこのプロパティをViewに表示すると、最終的には上のhtmlコード、つまりEmailへのリンクが生成されます.
(2)HiddenInput
先に学習したHiddenInputAttributeプロパティは、ModelMetadataオブジェクトのTemplateHintプロパティを「HiddenInput」に設定することです.HiddenInputテンプレートを使用すると、表示するデータは表示モードでもテキスト形式で表示され、編集モードではhiddenのタイプの要素も生成されます.ただし、ModelMetadataオブジェクトのHideSurroundingHtml属性がtrueの場合、編集モードでも表示モードでもデータの内容は表示されません.以下に示すように、編集モードで最終的に現れる属性値以外のテキストには、対応するタイプhiddenのinput要素があります.
[UIHint("HiddenInput")] public string Foobar{get;set;} {value} //     
{value}<input id="Foobar" name="Foobar" type="hidden" value="{value}"/>      //      //  HideSurroundingHtml   
[HiddenInput(DisplayValue=false)] public string Foobar{get;set;} //   html  
<input id="Foobar" name="Foobar" type="hidden" value="{value}"/>
(3)Html
htmlタグを含むデータをインタフェースにそのまま表示する必要がある場合は、表示モードに限られたHtmlテンプレートを採用することができます.FooとBarに同じvalueをハイパーリンクとして設定し,以下に示すように特性を付加するとhtmlラベルを含む属性がすべて出力され,属性Barは対応する符号化が行われる.
        [UIHint("Html")] public string Foo { get; set; } public string Bar { get; set; } //  
        <a href="baidu.com">baidu</a>                        //    
        &lt;a href=&quot;baidu.com&quot;&gt;baidu&lt;/a&gt   //    
(4)Text
textプロパティを使用すると、表示モードでは直接テキスト形式で出力され、編集モードでは次のコードに示すように1つの単行のテキストボックスに対応します.
 [UIHint("Text")] public string Foo { get; set; } 
{value}
// <input class="text-box single-line" id="Foo" name="Foo" type="text" value="value"> //
(5)Url
EmailAddressやhtmlと同様に、Urlは表示モードに限定されます.urlを表す文字列について、リンクで表示する場合は、このテンプレートを使用します.
[UIHint("Url")] public string Foo { get; set; } <a href="http://www.baidu.com">http://www.baidu.com</a> //     
(6)MultilineText、Password、PhoneNumber
この3つの特性は名前から内容を推測できるはずで、1つ目の特性の役割は編集モードで編集するデータを複数行の形式に提示することであり、textがtextareaに変わると理解できる.2つ目は、提示された内容をinputのpasswordの効果と同じように表示させることです.3つ目は生成されたViewのinput属性typeがtelである.
(7)Collection
Collectionテンプレートは、集合オブジェクトの表示と編集に使用され、そのテンプレートを使用する集合データについては、編集モードまたは表示モードにかかわらず各要素が遍歴し、メンバーを記述するModelメタデータに基づいてその表示方法が決定されます.ここでは、複数の属性のレンダリングとしても理解でき、レンダリング時にデータがtrueまたはfalseの場合、htmlがcheckboxとして自動的に生成されます.
(8)DateTime,DateTime-local,Date,Time
この4つのプロパティは編集モードで表示され、Viewレンダリング時にinputのtypeプロパティはそれぞれ「datetime」、「datetime-local」、「date」、「time」である.