1

DataAnnotationsModelMetadataProvider'sGetMetadataForProperties(..., Type containerType) と。のcontainerTypeとmodelTypeの違いは何ですかGetMetadataForType(..., Type modelType)。また、CustomerViewModelを使用した架空の「編集」ページなど、それらの値の例も示したいと思います。

4

1 に答える 1

0

GetMetadataForPropertiesModelMetadataで見つかった各プロパティのインスタンスを返しますcontainerType

だからあなたが持っているなら:

public class CustomerViewModel
{
   [DisplayName("Customer Name")]
   public string Name { get; set; }
   public string AccountNumber { get; set; }
   // etc.
}

そしてこのサンプルコード:

var model = new CustomerViewModel();

var propertiesMetadata = provider.GetMetadataForProperties(model, model.GetType());

var customerName = propertiesMetadata.Where(m => m.PropertyName == "Name").First().DisplayName; // customerName would equal "Customer Name"

一方GetMetadataForType、表面上はコンテナ自体のメタデータを取得します。

例:

var model = new CustomerViewModel();

var metadata = provider.GetMetadataForType(() => model, model.GetType());

var customerName = metadata.Properties.Where(m => m.PropertyName == "Name").First().DisplayName; // customerName would equal "Customer Name"

このようなものは、主にモデルバインディング、検証、およびビューエンジン内で内部的に使用されます。

ビュー自体では、これらのメソッドに直接アクセスすることはありません。あなたのビューはすでにModelMetadataアクセス可能になります。次のビュー(CustomerViewModelモデルタイプとして使用)は、モデルの各プロパティの表示名でスパンを出力します。

@foreach (var propertyMetadata in ViewData.ModelMetadata.Properties) {
  <span>@propertyMetadata.DisplayName</span>
}

// the resulting HTML should be <span>Customer Name<span><span>Account Number</span>
于 2012-06-07T09:23:52.907 に答える