zoukankan      html  css  js  c++  java
  • C# 模型 特性标记

    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、定长的类型。

     1 public class Movie
     2     {
     3       //可以将同个字段或属性的数据注解合并成一行。 
     4 
     5       public int ID { get; set; } 
     6 
     7         [Display(Name="片名")] //定义网页中显示的字段名称。
     8         [Required(AllowEmptyStrings=false,ErrorMessage="{0}不能为空")] //值类型(decimal,int,float,double,boolean等)默认不能为空,可以通过Required注解属性自定义错误提示消息,ErrorMessage中{0}表示字码名称,如果在Display(Name="")属性中已声明,则使用Name值,如本例中的"片名"。    
     9 
    10    [StringLength(20,MinimumLength=3,ErrorMessage="{0}必须大于{2},小于{1}")] //StringLength注解属性第一个参数是最大字段值,会更改数据库的结构,MinimunmLength不会更改数据库的结构,但会应用于客户端和服务端的验证。ErrorMessage 中{0}表示字码名称,{1}表示StringLength的第一个参数最大值,{2}表示StringLength的第二个参数MinimumLength;
    11         public string Title { get; set; }
    12 
    13         [Display(Name="发行日期")]
    14         [DataType(DataType.Date)]  //利用浏览器支持html5的属性,此处是出现一个日期选取框,不更改数据库     [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] //指定显示格式。ApplyFormatInEditMode 应用于当出现一个文本框进行数据编辑的时候,是否应用这个指定的格式。DisplayFormat特别适用于谷歌浏览器的字段值被正确的渲染。
    15         public DateTime ReleaseDate { get; set; }
    16 
    17         [Display(Name="影片分类")]
    18         [Required(ErrorMessage="{0}不能为空")]
    19         [StringLength(30)]
    20         public string Genre { get; set; }
    21         
    22         [Required(AllowEmptyStrings=false,ErrorMessage="{0}必填")]    
    23 
    24        [Display(Name="价格")]
    25         [Column(TypeName="money")] //指定字段映射到数据库表的列名。
    26         [Range(1,1000,ErrorMessage="{0}必须大于{1},并且小于{2}")] //{0}表示字段的显示名称,{1}为Range的第一个参数,最小值。{2}为Range的第二个参数,最大值。
    27         [DataType(DataType.Currency)] //利用浏览器支持html5的属性,此处是出现基于本地的货币符号。
    28         public decimal Price { get; set; }
    29 
    30         [Display(Name="影片分级")]
    31         [Required(ErrorMessage="{0}不能为空")]
    32         [StringLength(6,ErrorMessage="{0}不能超过6个字")]
    33         public string Rating { get; set; }
    34 
    35        [EmailAddress]  //邮件址验证,能提供服务端与客户端的验证。
    36 
    37         public string EmailAddress {get;set;}
    38 
    39  
    40 
    41        [Display(Name="栏目描述")]
    42        [DataType(DataType.MultilineText)] //指定类型为多行字码。视图中使用   @Html.EditorFor(model => model.CategoryDescription, new { htmlAttributes = new { @class = "form-control" } })将为产生<textarea>文本域标签。
    43        public string CategoryDescription { get; set; }
    44 
    45  
    46 
    47        [Display(Name="QQ")]
    48        [RegularExpression(@"^[1-9][0-9]{5,9}$",ErrorMessage="你输入的不是有效的QQ号码")]    // 正则表达式验证 @为正则表达式 不是常规字面量,而是逐字字面量(转义字符串不会被求值), 不会被转义。^表示正则表达式的起始部分,   $表示正则表达式的结束。
    49         public string QQ { get; set; }
    50 
    54     }

    控制器方法中的if(ModelState.IsValid),就是来检查数据是否合法,它将内置的属性同时支持客户端、浏览器的验证。如果错误发生,先是执行客户端验证,如果禁用了JAvaScript ,则执行服务端验证。如果启用了JavaScript,只执行客户端验证,从而不会执行控制器的服务端的方法。
  • 相关阅读:
    cf 1179 C
    P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
    bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
    luoguP4173 残缺的字符串 FFT
    [HNOI2016]序列 CDQ+DP
    [TJOI2017]不勤劳的图书管理员
    loj2058 「TJOI / HEOI2016」求和 NTT
    bzoj4503: 两个串
    luoguP4721 【模板】分治 FFT
    [Cqoi2016]K远点对 K-Dtree
  • 原文地址:https://www.cnblogs.com/bysx/p/7800505.html
Copyright © 2011-2022 走看看