DataAnnotationsModelMetadataProvider containerType,modelType

时间:2012-06-07 09:10:19

标签: asp.net asp.net-mvc-3

DataAnnotationsModelMetadataProvider的{​​{1}}和GetMetadataForProperties(..., Type containerType)中的containerType和modelType有何区别? 我也想举例说明他们的价值观,例如:对于一些虚构的“编辑”页面,使用CustomerViewModel。

1 个答案:

答案 0 :(得分:0)

GetMetadataForProperties会为ModelMetadata中找到的每个属性返回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>