zoukankan      html  css  js  c++  java
  • 模型类的数据注解特性

    Asp.net MVC中(由.net框架和EF提供的)验证支持是DRY(Don't Repeat Yourself)原则实践的一个很好的例子。只要在模型类中给字段和属性声明注解特性,就可以应用于使用这个模型的所有的视图中,并同时实现客户端验证和服务器验证。(先执行客户端验证,客户端验证通过后或浏览器禁用JavaScript,再执行服务器端验证)通过数据注解特性,可以指定模型类的数据显示格式,验证规则,和数据库映射规则。 如果不在模型类中加数据注解特性,默认只执行服务端验证。

    System.ComponentMode.DataAnnotations 命名空间提供了一些内置的属性,还可以自定义错误消息。

    验证属性:Required,定义不能为空;Stringlength,字符长度;RegularExpression,正则表达式;Range()范围.

    显示属性:Display(Name=),定义显示的字段名,DispalyFormat(),显示格式。

    DataType(DataType.XX)适用于当需要显示类型比数据库中固有的类型还要具体的时候,比如:DataType(DataType.Date),仅仅显示日期,而不显示时间。DataType(DataType.Currency),将Decimal类型显示为货币。    它不提供验证,但可以启用浏览器支持html5的一些特征。

    数据库映射:Column("")映射到指定的列名,Column(TypeName="")当数据库中的类型比C#中类型更具体的时候,映射到数据库中指定的类型。

    默认情况一下,String 类型将会映射到SQL中的nvarchar 类型,也就是可变长度,存储Unicode字符(双字节字符)。但可以通过Column(TypeName="char") 类型变成存储非Unicode、定长的类型。

    代码如下:

     public class Movie
        {
          //可以将同个字段或属性的数据注解合并成一行。 

          public int ID { get; set; } 

            [Display(Name="片名")] //定义网页中显示的字段名称。
            [Required(AllowEmptyStrings=false,ErrorMessage="{0}不能为空")] //值类型(decimal,int,float,double,boolean等)默认不能为空,可以通过Required注解属性自定义错误提示消息,ErrorMessage中{0}表示字码名称,如果在Display(Name="")属性中已声明,则使用Name值,如本例中的"片名"。    

       [StringLength(20,MinimumLength=3,ErrorMessage="{0}必须大于{2},小于{1}")] //StringLength注解属性第一个参数是最大字段值,会更改数据库的结构,MinimunmLength不会更改数据库的结构,但会应用于客户端和服务端的验证。ErrorMessage 中{0}表示字码名称,{1}表示StringLength的第一个参数最大值,{2}表示StringLength的第二个参数MinimumLength;
            public string Title { get; set; }

            [Display(Name="发行日期")]
            [DataType(DataType.Date)]  //利用浏览器支持html5的属性,此处是出现一个日期选取框,不更改数据库     [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] //指定显示格式。ApplyFormatInEditMode 应用于当出现一个文本框进行数据编辑的时候,是否应用这个指定的格式。DisplayFormat特别适用于谷歌浏览器的字段值被正确的渲染。
            public DateTime ReleaseDate { get; set; }

            [Display(Name="影片分类")]
            [Required(ErrorMessage="{0}不能为空")]
            [StringLength(30)]
            public string Genre { get; set; }
           
            [Required(AllowEmptyStrings=false,ErrorMessage="{0}必填")]    

           [Display(Name="价格")]
            [Column(TypeName="money")] //指定字段映射到数据库表的列名。
            [Range(1,1000,ErrorMessage="{0}必须大于{1},并且小于{2}")] //{0}表示字段的显示名称,{1}为Range的第一个参数,最小值。{2}为Range的第二个参数,最大值。
            [DataType(DataType.Currency)] //利用浏览器支持html5的属性,此处是出现基于本地的货币符号。
            public decimal Price { get; set; }

            [Display(Name="影片分级")]
            [Required(ErrorMessage="{0}不能为空")]
            [StringLength(6,ErrorMessage="{0}不能超过6个字")]
            public string Rating { get; set; }

           [EmailAddress]  //邮件址验证,能提供服务端与客户端的验证。

            public string EmailAddress {get;set;}

           [Display(Name="栏目描述")]
           [DataType(DataType.MultilineText)] //指定类型为多行字码。视图中使用   @Html.EditorFor(model => model.CategoryDescription, new { htmlAttributes = new { @class = "form-control" } })将为产生<textarea>文本域标签。
           public string CategoryDescription { get; set; }

           [Display(Name="QQ")]
           [RegularExpression(@"^[1-9][0-9]{5,9}$",ErrorMessage="你输入的不是有效的QQ号码")]    // 正则表达式验证 @为正则表达式 不是常规字面量,而是逐字字面量(转义字符串不会被求值), 不会被转义。^表示正则表达式的起始部分,   $表示正则表达式的结束。
            public string QQ { get; set; }


        }

    控制器方法中的if(ModelState.IsValid),就是来检查数据是否合法,它将内置的属性同时支持客户端、浏览器的验证。如果错误发生,先是执行客户端验证,如果禁用了JAvaScript ,则执行服务端验证。如果启用了JavaScript,只执行客户端验证,从而不会执行控制器的服务端的方法。

  • 相关阅读:
    大型高性能ASP.NET系统架构设计
    读写锁ReaderWriterLockSlim
    日常生活英语单词大全
    unity3d读取plist或xml文件
    WIN7开无线
    asp.net 2.0中新增的web.config的默认namespace功能 (转)
    面向对象的一些基本概念
    大话设计模式之策略模式
    大话设计模式之简单的工厂模式
    iOS UI 之UILable
  • 原文地址:https://www.cnblogs.com/liuyuanhao/p/4322038.html
Copyright © 2011-2022 走看看