• MVC三层架构之Model:认识ModelMetaData


    命名空间: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

     

  • 相关阅读:
    Linux 禁用笔记本触摸板
    Linux 下安装android
    关于JAVA多线程的那些事__初心者
    ADT下开发环境的配置--个人配置啦 Eclipse Color Themes
    关于权限系统的一些思考
    关于线程安全的单例模式的讨论
    说下Fedora下把SpiderMonkey放入Eclipse内编译的过程
    基于Eclipse构建Hadoop源码阅读环境
    Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
    CentOS6.5安装配置
  • 原文地址:https://www.cnblogs.com/lemonP/p/7161376.html
Copyright © 2020-2023  润新知