Asp.net MVC中(由.net框架和EF提供的)验证支持是DRY(Don‘t Repeat Yourself)原则实践的一个很好的例子。只要在模型类中给字段和属性声明注解属性,就可以应用于使用这个模型的所有视图中,通过数据注解,可以指定模型类的数据显示格式,验证规则,和数据库映射规则。
System.ComponentMode.DataAnnotations 命名空间提供了一些内置的属性,都可以自定义错误消息。
验证属性:Required,定义不能为空;Stringlength,字符长度;RegularExpression,正则表达式;Range()范围.
显示属性:Display(Name=),定义显示的字段名,DispalyFormat(),显示格式。
数据库映射:Column("")映射到指定的列名,Column(TypeName="")当数据库中的类型比C#中类型更具体的时候,映射到数据库中指定的类型。
其它:DataType(DataType.XX)可以启用浏览器支持html5的一些特征。
代码如下:
public class Movie
{
public int ID { get; set; }
[Display(Name="片名")] //定义网页中显示的字段名称。
[Required(AllowEmptyStrings=false,ErrorMessage="{0}不能为空")] //值类型(decimal,int等)默认不能为空,可以通过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)] //指定显示格式。
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; }
}
控制器方法中的if(ModelState.IsValid),就是模型绑定器来检查数据是否合法,它将 内置的属性同时支持客户商、浏览器的验证。如果错误发生,先是