命名空间:System.Web.Mvc
Microsoft官网定义:Provides a container for common metadata, for the ModelMetadataProvider class, and for the ModelValidator class for a data model.
在扩展Validation和ModelBuilder时候我们会经常看到ModelMetadata的身影,ModelMetadata其实就是描述Model的数据结构和Model的每个数据成员的一些特性。
查看ModelMetaData构造器,会发现有几个成员:
public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);
ModelMetaDataProvider:是用来获取ModelMetaData的
Type:Container type
ModelAccessor:Model Accessor
ModelType:model type
PropertyName:name of property
ModelMetaData不仅仅可以描述一个简单类型,也可以用来描述一些复杂的数据类型,复杂数据类型本身和其数据成员都通过ModelMetadata来表示
比如:User类是一个复杂数据类型是通过ModelMetadata表示,同时User有一些简单类型的成员:string UserName,string UserPassword 也有些是复杂的成员:Address DetailAddress. 所以ModelMetadata本身就是一个树级结构。
ModelMetaData.IsComplexType 用来判断Property是否为复杂类型,.net 内置类型是简单类型,像上边的User和Address被视为复杂类型。
MetaDataType
MetaDataType 在MVC中用来对Model层数据验证,指定与数据模型类关联的元数据类。
通过EF+MVC时,EF的database first会自动生成数据库对应的model,例如User表,这时候我们就可以同过Partial class
把数据模型的验证放在另外一个class里面,需要用到MetaDataTypeAttribute。两个Partial 类要在同一个命名空间里。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public partial class User { public int id { get; set; } public string name { get; set; } public string pass { get; set; } public bool sex { get; set; } [DataType(DataType.Date)] public DateTime birthday { get; set; } public decimal Income { get; set; } } [MetadataType(typeof(UserMeta))] public partial class User { public class UserMeta { [ScaffoldColumn(false)] public int id { get; set; } [Display(Name = "姓名")] [Remote("MutipleNameChecking", "Validation", ErrorMessage = "用户名已经存在!")] //参数1参数2分别代表要回调的action和controller [Required(ErrorMessage = "{0}不能为空")] public string name { get; set; } [Display(Name = "密码")] [StringLength(8, MinimumLength = 6, ErrorMessage = "{0}要求{2}到{1}个字符")] [Required(ErrorMessage = "不能为空")] [DataType(DataType.Password)] [RegularExpression("^[0-9]*", ErrorMessage = "必须为数字")] public string pass { get; set; } [Display(Name = "性别")] public bool sex { get; set; } [Display(Name = "出生日期")] [DataType(DataType.Date)] public DateTime birthday { get; set; } [Display(Name = "收入")] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")] public decimal Income { get; set; } } }