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,只执行客户端验证,从而不会执行控制器的服务端的方法。

 

转载于:https://www.cnblogs.com/bysx/p/7800505.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值