plina

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

命名空间: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 类要在同一个命名空间里。

 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; }
        }
    }
View Code

 

posted on 2017-07-14 14:28  plina  阅读(753)  评论(0编辑  收藏  举报