asp.NetModelメタデータ学習一
7035 ワード
1.Modelメタデータ
Modelメタデータは、パラメータバインディング、パラメータ検証、データ・オブジェクトのViewでのプレゼンテーションに対応するガイダンス情報を提供するデータ型の説明です.
Modelメタデータは、1つのデータ・オブジェクトに4つの属性があり、そのうちの1つの属性はまた1つのデータ・オブジェクトであり、このデータ・オブジェクトにも独自の属性がある階層構造です.ASP.NET MVCは、Modelメタデータを記述するために使用されるModelMetadataオブジェクトであり、そのコードフラグメントは以下の通りである.彼の読み取り専用属性Propertiesは、すべての属性メンバーを記述するModelメタデータのリストを表します.
データ型そのものを記述するModelMetadataと、このデータ型の属性を記述するModelMetadataとは関係を含み、一般的に前者を後者と呼ぶコンテナである.ModelMetadataオブジェクトの役割は、タイプまたはその属性メンバーの説明です.IsComplexTypeプロパティは、記述されたデータ型が単純なタイプか複雑なタイプかを判断するために使用され、判断の基準は文字列からのタイプ変換をサポートするかどうかだけである.
2.Modelメタデータのカスタマイズ
ASP.NETは、基本的にSystemに定義データ注釈特性を用いて、ターゲットタイプまたはデータメンバーのModelメタデータをカスタマイズして記述する.ComponentModel.DataAnnotations.dllプログラムセットの中にあります.Modelメタデータは、対応するデータオブジェクトのViewでのデフォルトのレンダリング方法を決定します.次に6つの重要なデータ特性を学びます.
(1)UIHintAttribute
HtmlHelperおよびHtmlHelperは、Display/DisplayFor、Edit/EditFor、DisplayForModel/EditForModel、Label/Label Forなど、一連のテンプレートメソッドを定義する.テンプレートメソッドとは、これらのテンプレートメソッドを呼び出すと、定義されたテンプレートに従ってブラウザにデータが最終的に表示されることを意味します.各テンプレートには、特定の名前が付けられています.これらのテンプレートメソッドが呼び出されたときに、指定したテンプレートが表示されない場合は、表示されたデータを記述するModelメタデータを使用してデフォルトのテンプレートが得られます.デフォルトで使用されるテンプレート名は、ModelMetadataのTemplateHintプロパティによって表されます.
public virtual string TemplateHint{get;set;}.TemplateHintプロパティはUIHintAttributeプロパティでカスタマイズできます.UIHintAttributeには2つの重要なプロパティがあります.stringタイプのPresentationLayerは、表示レイヤのタイプ(例えば、Html、WPF、WinFormsなど)を表します.stringタイプのUIHintは、使用するテンプレート名を記述します.UIHintAttributeタイプに適用されるAttributeUsageAttributeプロパティの場合、AllowMultipleプロパティはtrueに設定され、同じターゲット要素に複数のUIHintAttributeプロパティを適用できることを意味します.上記の場合、ASP.NET MVCは、PresentationLayerをMVCとする(大文字と小文字を区別しない)を優先し、PresentationLayer属性値がMVCでない場合はPresentationLayerをnullとするUIHintAttribute特性を選択し、複数のマッチングが成功した場合は1番目を選択します.
(2)HiddenlnputAttributeとScaffoldColumnAttribute
名前の通り、最初のプロパティはModelのプロパティを非表示にするために使用されます.また、HiddenlnputAttributeはDataAnnotationsで定義されていません.dllという多くの特性を定義するプログラムセットの中で、Systemに定義されています.Web.Mvcというネーミングスペースの下で,この特性はMVC設計に変わった.デフォルトでは、HiddenlnputAttributeというプロパティを適用したターゲットオブジェクトはビューに表示されますが、編集できません.ターゲットを非表示にする場合は、プロパティを追加するときにDisplayValueプロパティをFalseに設定します(デフォルトはTrue).たとえば、次のような変数testがあります.
[HiddenInput]または[HiddenInput(DisplayValue=false)]
public string test{get;set;}
HiddenInputAttributeプロパティModelメタデータに対するカスタマイズはModelMetadataの2つのプロパティに現れます.1つはデフォルトテンプレートを表すTemplateHintプロパティです.1つはboolタイプのHideSurroundingHtmlで、ターゲット要素がインタフェースに表示される必要があるかどうかを示します.ターゲットタイプまたはデータメンバーのModelMetadataオブジェクトにHiddenInputAttributeプロパティが追加された場合、このオブジェクトのTemplateHintプロパティは「HiddenInput」に設定され、HideSurroundingHtmlの値はDisplayValueによって決定されます.ModelMetadataを複数のプロパティで同時にカスタマイズする場合、優先度はマニュアルを参照してください.ここでは、UIHintAttributeとHiddenInputAttributeが同時に機能する場合、前者の優先度が高くなります.
ScaffoldColumnAttributeの機能はHiddenとあまり差がありません.違いは、Hiddenの特性はhtmlコードにhiddenラベルを付け、Scaffoldはhtmlにこの属性がまったく現れないようにすることです.ScaffoldColumnAttributeには、モデルMetadataのShowForDisplayおよびShowForEditプロパティを制御するために最終的に使用されるコンストラクション関数で初期化されたターゲット要素が生成されたhtmlに表示されるかどうかを示す読み取り専用プロパティがあります.上の2つの属性はそれぞれHtmlに現れるかどうかと編集モードに現れるhtmlに現れるかどうかを表し、この2つの属性はデフォルトではTrueです.
(3)DataType AttributeとDisplayFormatAttribute
DataType Attributeプロパティは、intやstringのようなCLRタイプではなく、DataTypeによって列挙された時間、日付、電話番号などの特殊なフォーマットタイプなど、データ型を指定するためによく使用されるデータ寸法プロパティです.このプロパティはValidationAttributeクラスから継承されるため、実際には検証プロパティです.DataType Attributeの読み取り専用プロパティは、データのフォーマットに関連する別のプロパティに関連しています.次の定義を参照してください.
public DisplayFormatAttribute DisplayFormat{get;},DisplayFormatAttributeでは、インタフェース上のターゲット要素の表示フォーマットを制御するためにフォーマット文字列を指定できます.このフォーマット文字列はDisplayFormatAttributeクラスのDataFormatStringで表されます.特定のDataType列挙オブジェクトに対してDataType Attributeオブジェクトを作成すると、対応するフォーマット文字列に基づいてDisplayFormatAttributeオブジェクト、すなわちDisplayFormatに値を割り当てます.ここで直接適用するDisplayFormatAttributeは、DataTypeAttributeが携帯するDisplayFormatよりも優先度が高い.
(4)EditableAttributeとReadOlnyAttribute
上記の2つのプロパティは、ターゲットデータ要素の読み取り/書き込みを制御するために使用され、boolタイプのプロパティがそれぞれ1つあります.AllowEditは編集可能かどうかを示します.IsReadOnlyは読み取り専用かどうかを示します.編集できなくても読み取り専用として理解できるため、この2つの特性の役割は同じであり、ModelMetadataオブジェクトのIsReadOnly属性を共に制御しています.ここで、EditableAttributeは優先度が高い.
(5)DisplayAttributeとDisplayName Attribute
DisplayAttributeプロパティは、ターゲット・データ・メンバーのために、文字列タイプのPromptプロパティがターゲット・データ・メンバーに透かしで表示される文字列を設定する説明文を定義します.このプロパティでは、リソースファイルで定義することもできます.DisplayAttributeプロパティクラスには、ResourceTypeというタイプのプロパティがあります.このプロパティに値を割り当てると、Promptなどの5つのプロパティ値(他の4つはName、ShortName、Description、Order、これらはDisplayAttributeクラスのプロパティ)が対応するリソースエントリの名前とみなされます.
DisplayNameAttributeプロパティは、コンストラクション関数で初期化されていない場合は空の文字列であるターゲット要素の表示名を設定します.この2つのプロパティは、ModelMetadataのプロパティにも関連します.
(6)RequiredAttribute
最後のプロパティ機能は、ターゲット要素を必要なデータメンバー、すなわち寸法を設定することであり、RequiredAttributeプロパティが適用されたデータメンバーに対してModelMetadataに対応するIsRequiredプロパティがtrueに設定される.
Modelメタデータは、パラメータバインディング、パラメータ検証、データ・オブジェクトのViewでのプレゼンテーションに対応するガイダンス情報を提供するデータ型の説明です.
Modelメタデータは、1つのデータ・オブジェクトに4つの属性があり、そのうちの1つの属性はまた1つのデータ・オブジェクトであり、このデータ・オブジェクトにも独自の属性がある階層構造です.ASP.NET MVCは、Modelメタデータを記述するために使用されるModelMetadataオブジェクトであり、そのコードフラグメントは以下の通りである.彼の読み取り専用属性Propertiesは、すべての属性メンバーを記述するModelメタデータのリストを表します.
public class ModelMetadata
{
// ...
//4
// Model
public Type ModelType { get; }
// , Model Model, ModelType, null
public Type ContainerType { get; }
// ModelType
public virtual bool IsComplexType { get; }
// ModelType
public bool IsNullableValueType { get; }
// 2 :
public object Model { get; set; }
// , PropertyName null
public string PropertyName { get; }
// , Key ,Value 。
// AdditionalMetadataAttribute ModelMetadata 。
public virtual Dictionary<string, object> AdditionalValues { get; }
// ModelMetadata
protected ModelMetadataProvider Provider { get; set; }
}
データ型そのものを記述するModelMetadataと、このデータ型の属性を記述するModelMetadataとは関係を含み、一般的に前者を後者と呼ぶコンテナである.ModelMetadataオブジェクトの役割は、タイプまたはその属性メンバーの説明です.IsComplexTypeプロパティは、記述されたデータ型が単純なタイプか複雑なタイプかを判断するために使用され、判断の基準は文字列からのタイプ変換をサポートするかどうかだけである.
2.Modelメタデータのカスタマイズ
ASP.NETは、基本的にSystemに定義データ注釈特性を用いて、ターゲットタイプまたはデータメンバーのModelメタデータをカスタマイズして記述する.ComponentModel.DataAnnotations.dllプログラムセットの中にあります.Modelメタデータは、対応するデータオブジェクトのViewでのデフォルトのレンダリング方法を決定します.次に6つの重要なデータ特性を学びます.
(1)UIHintAttribute
HtmlHelperおよびHtmlHelper
public virtual string TemplateHint{get;set;}.TemplateHintプロパティはUIHintAttributeプロパティでカスタマイズできます.UIHintAttributeには2つの重要なプロパティがあります.stringタイプのPresentationLayerは、表示レイヤのタイプ(例えば、Html、WPF、WinFormsなど)を表します.stringタイプのUIHintは、使用するテンプレート名を記述します.UIHintAttributeタイプに適用されるAttributeUsageAttributeプロパティの場合、AllowMultipleプロパティはtrueに設定され、同じターゲット要素に複数のUIHintAttributeプロパティを適用できることを意味します.上記の場合、ASP.NET MVCは、PresentationLayerをMVCとする(大文字と小文字を区別しない)を優先し、PresentationLayer属性値がMVCでない場合はPresentationLayerをnullとするUIHintAttribute特性を選択し、複数のマッチングが成功した場合は1番目を選択します.
(2)HiddenlnputAttributeとScaffoldColumnAttribute
名前の通り、最初のプロパティはModelのプロパティを非表示にするために使用されます.また、HiddenlnputAttributeはDataAnnotationsで定義されていません.dllという多くの特性を定義するプログラムセットの中で、Systemに定義されています.Web.Mvcというネーミングスペースの下で,この特性はMVC設計に変わった.デフォルトでは、HiddenlnputAttributeというプロパティを適用したターゲットオブジェクトはビューに表示されますが、編集できません.ターゲットを非表示にする場合は、プロパティを追加するときにDisplayValueプロパティをFalseに設定します(デフォルトはTrue).たとえば、次のような変数testがあります.
[HiddenInput]または[HiddenInput(DisplayValue=false)]
public string test{get;set;}
HiddenInputAttributeプロパティModelメタデータに対するカスタマイズはModelMetadataの2つのプロパティに現れます.1つはデフォルトテンプレートを表すTemplateHintプロパティです.1つはboolタイプのHideSurroundingHtmlで、ターゲット要素がインタフェースに表示される必要があるかどうかを示します.ターゲットタイプまたはデータメンバーのModelMetadataオブジェクトにHiddenInputAttributeプロパティが追加された場合、このオブジェクトのTemplateHintプロパティは「HiddenInput」に設定され、HideSurroundingHtmlの値はDisplayValueによって決定されます.ModelMetadataを複数のプロパティで同時にカスタマイズする場合、優先度はマニュアルを参照してください.ここでは、UIHintAttributeとHiddenInputAttributeが同時に機能する場合、前者の優先度が高くなります.
ScaffoldColumnAttributeの機能はHiddenとあまり差がありません.違いは、Hiddenの特性はhtmlコードにhiddenラベルを付け、Scaffoldはhtmlにこの属性がまったく現れないようにすることです.ScaffoldColumnAttributeには、モデルMetadataのShowForDisplayおよびShowForEditプロパティを制御するために最終的に使用されるコンストラクション関数で初期化されたターゲット要素が生成されたhtmlに表示されるかどうかを示す読み取り専用プロパティがあります.上の2つの属性はそれぞれHtmlに現れるかどうかと編集モードに現れるhtmlに現れるかどうかを表し、この2つの属性はデフォルトではTrueです.
(3)DataType AttributeとDisplayFormatAttribute
DataType Attributeプロパティは、intやstringのようなCLRタイプではなく、DataTypeによって列挙された時間、日付、電話番号などの特殊なフォーマットタイプなど、データ型を指定するためによく使用されるデータ寸法プロパティです.このプロパティはValidationAttributeクラスから継承されるため、実際には検証プロパティです.DataType Attributeの読み取り専用プロパティは、データのフォーマットに関連する別のプロパティに関連しています.次の定義を参照してください.
public DisplayFormatAttribute DisplayFormat{get;},DisplayFormatAttributeでは、インタフェース上のターゲット要素の表示フォーマットを制御するためにフォーマット文字列を指定できます.このフォーマット文字列はDisplayFormatAttributeクラスのDataFormatStringで表されます.特定のDataType列挙オブジェクトに対してDataType Attributeオブジェクトを作成すると、対応するフォーマット文字列に基づいてDisplayFormatAttributeオブジェクト、すなわちDisplayFormatに値を割り当てます.ここで直接適用するDisplayFormatAttributeは、DataTypeAttributeが携帯するDisplayFormatよりも優先度が高い.
(4)EditableAttributeとReadOlnyAttribute
上記の2つのプロパティは、ターゲットデータ要素の読み取り/書き込みを制御するために使用され、boolタイプのプロパティがそれぞれ1つあります.AllowEditは編集可能かどうかを示します.IsReadOnlyは読み取り専用かどうかを示します.編集できなくても読み取り専用として理解できるため、この2つの特性の役割は同じであり、ModelMetadataオブジェクトのIsReadOnly属性を共に制御しています.ここで、EditableAttributeは優先度が高い.
(5)DisplayAttributeとDisplayName Attribute
DisplayAttributeプロパティは、ターゲット・データ・メンバーのために、文字列タイプのPromptプロパティがターゲット・データ・メンバーに透かしで表示される文字列を設定する説明文を定義します.このプロパティでは、リソースファイルで定義することもできます.DisplayAttributeプロパティクラスには、ResourceTypeというタイプのプロパティがあります.このプロパティに値を割り当てると、Promptなどの5つのプロパティ値(他の4つはName、ShortName、Description、Order、これらはDisplayAttributeクラスのプロパティ)が対応するリソースエントリの名前とみなされます.
DisplayNameAttributeプロパティは、コンストラクション関数で初期化されていない場合は空の文字列であるターゲット要素の表示名を設定します.この2つのプロパティは、ModelMetadataのプロパティにも関連します.
public class DisplayNameAttribute:Attribute
{
public DisplayNameAttribute();
public DisplayNameAttribute(string displayName);
public virtual string DisplayName{get;}
}
(6)RequiredAttribute
最後のプロパティ機能は、ターゲット要素を必要なデータメンバー、すなわち寸法を設定することであり、RequiredAttributeプロパティが適用されたデータメンバーに対してModelMetadataに対応するIsRequiredプロパティがtrueに設定される.