ASP.NETMVC5----常见的数据注解和验证
只要⼀直⾛,慢点⼜何妨。
在使⽤MVC 模式进⾏开发时,数据注解是经常使⽤的(模型之上操作),下⾯是我看书整理的⼀些常见的⽤法。验证
从全局来看,发现逻辑仅是整个验证的很⼩的⼀部分。验证⾸先需要管理⽤户友好(本地化)的与验证逻辑相关的错误提⽰消息;当验证失败时,在把这些错误提⽰消息呈现给⽤户界⾯上,当然还要向⽤户提供从验证失败中恢复的机制。数据注解
注解是⼀种通⽤机制,可以⽤来向框架注⼊元数据,同时,框架不只驱动元数据的验证,还可以在⽣成显⽰和编辑模型的HTML 标记时使⽤元数据。通俗的说就是模型上⾯的特定标识符(具有⼀定意义和作⽤)。
数据注解定义在⼀般在命名空间”System.ComponentModel.DataAnnotations”提供了服务器端验证的功能,在模型属性上使⽤时,框架也⽀持客户端验证。注解后⾯都是可以添加错误提⽰语的,ErrorMessage 是每个验证特性中⽤来设置错误提⽰消息的参数,⽐如:
[Required(ErrorMessage = "不能为空")]        public int Age { get; set; }
Required
强调属性是必须的,不可为空。当属性中有⼀个是null 或空时,会引发⼀个验证错误。
[Required]        public int Age { get; set; }
StringLength
要求必须输⼊名字的长度。参数可以限制最⼩的。如下:
[StringLength(160,MinimumLength = 3)]        public string Name { get; set; }
RegularExpression
正则表达式验证,⽐如邮箱等需要验证正则的地⽅。很是⽅便,这样就减少了服务端的验证。
[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",ErrorMessage = "邮箱输⼊有误,重新输⼊。")]                public string Email { get; set; }
Range
⽤来指定数值类型值得最⼩值和最⼤值。主要为int 类型服务。其余的也可以,需要使⽤构造函数的重载版本。Type 参数来做。
[Range(20,30,ErrorMessage = "年龄不符合要求")]
public int Age { get; set; }
[Range(typeof(decimal),"0.00","59.99")]        public decimal Price { get; set; }
Compare
确定两个模型属性拥有⼀样的值。密码的验证(输⼊两次,看⼆者是否⼀样。),参数为前⾯模型的值。什么是验证,数据注解「」
验证注解的使⽤「」
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; }
[Compare("Password")]        public string PasswordPalt { get; set; }
Remote 此特性利⽤服务器端的回调函数执⾏客户端的验证逻辑。通俗的说就是这个特性可以直接到某个控制器的action 并且执⾏其中的⽅法。
/// <summary>
/// 验证模型中输⼊的姓名是否和数据库中重复
/// </summary>
/// <returns></returns>
public JsonResult CheckUserName(string username)
{
//数据库中的相关验证
return Json(DateTime.Now.ToString(),JsonRequestBehavior.AllowGet);
}
[Remote("CheckUserName", "Admin")]
public string UserName { get; set; }
上⾯控制器操作会利⽤与UserName 属性同名的参数进⾏验证,同时返回⼀个javascript object Notaion(json)对象中的布尔类型值(0/1)
⾃定义回复消息占位符
使⽤{0}占位符,来显⽰⽤户的输⼊,并且形成友好提⽰。
[Range(20,30,ErrorMessage = "年龄{0}不符合要求")]
public int Age { get; set; }
ASP.NET MVC 的验证特性是由模型绑定器,模型元数据,模型验证器和模型状态组成。验证和模型绑定
操作⽅法中添加参数这⾥有⼀个隐式地执⾏模型绑定,⼀般我们都需要这样写,这样也安全,不会说暴露出来参数。
利⽤UpdateModel 或TryUpdateModel ⽅法显式执⾏绑定
这个实际项⽬中使⽤的很少,⼀般都是通过隐式进⾏转换的。
[HttpPost,ActionName("Create")]
public ActionResult CreatePost(Student model)
{
var model2 = new Student();
UpdateModel(model2);
if (TryUpdateModel(model2))
{
}
return View(model);
}
可以看到参数中的为隐式转换,⾥⾯的model2为显式转换。if 中的返回的是bool 类型。模型绑定器⼀旦使⽤新值完成对模型属性的更新,就会利⽤当前的 模型元数据获得模型的所有验证器。MVC 运⾏时提供了⼀个验证器
(DataAnnotationsModelValidator)来与数据注解⼀同⼯作,这个模型验证器会到所有的验证特性并执⾏它们包含的验证逻服务端的⼀些处理(验证与绑定)「」
辑,模型绑定器捕获所有失败的验证规则并把它们放⼊模型状态中。
编程的⼀个重要原则是不能相信⽤户的输⼊
验证与模型状态
模型绑定的副产品是模型状态,也就是我们服务端验证的ModelState,此状态中不仅包含⽤户的输⼊,也含有每个相关属性的所有错误(与模型状态本⾝有关的错误),有错误,ModelState.IsValid 就返回false 。从⽽我们就可以进⾏验证。
public ActionResult CreatePost(Student model)
{
var s=ModelState.IsValidField("UserName");
var ss=ModelState["UserName"].Errors.Count;
var userName = ModelState["UserName"].Errors[0].ErrorMessage;  //获取错误消息
if (ModelState.IsValid)      //返回bool 类型
{
}
return View(model);        }
Display
显⽰模型属性设置友好的“显⽰名称”
[Display(Name = "姓名")]
[StringLength(160,MinimumLength = 3)]        public string Name { get; set; }
ScaffoldColumn
可以隐藏HTML 的辅助⽅法
[ScaffoldColumn(false)]        public string Address { get; set; }
DisplayFormat
处理属性各种格式化选项,当属性包含空值,可以提供可选的显⽰⽂本。也可以为包含标记的属性关闭HTML 编码。还可以运⾏时指定⼀个应⽤于属性值的格式化字符串。
[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:c}")]        public decimal Total { get; set; }
ReadOnly 可以确保默认的模型绑定器不使⽤请求中的新值来更新属性。
DataType
运⾏时提供关于属性的特定⽤途信息。String 类型的属性可应⽤于很多场合--可以保存e-mail 地址,URL 或密码。
[Required(ErrorMessage = "密码不能为空")]
[DataType(DataType.Password)]        public string Password { get; set; }
UIHint
给运⾏时提供⼀个模版名称,以备调⽤模版辅助⽅法渲染输出时使⽤。
1. 将验证逻辑封装在⾃定义的数据注解中。显⽰和编辑注解「」
⾃定义验证逻辑「」
2. 将验证逻辑封装在模型对象中。
把验证逻辑封装在⾃定义的数据注解中可以轻松地实现在多个模型中重⽤逻辑。需要在特性内部编写代码以应对不同类型的模型中。
⾃定义注解
所有的验证注解特性最终都派⽣⾃基类ValidationAttribute,它是个抽象类,在System.ComponentMode.DataAnnotation中定义。同样⾃定义的验证逻辑必须派⽣⾃ValidationAttribu
te的类。且重写IsValid⽅法(⽅法⾥⾯实现我们相应的逻辑)。
需求:限制⽤户输⼊地址中单词数量,设定⼀个最⼤值。
/// <summary>
/// ⾃定义模型验证
/// 输⼊数字的单词最⼤数量
/// </summary>
public class MaxWordsAttribute:ValidationAttribute
{
private readonly int _maxWord;
public MaxWordsAttribute(int maxWord)
{
_maxWord = maxWord;
}
protected override ValidationResult IsValid(object value,ValidationContext validationContext)
{
if (value!=null)
{
//将输⼊转换为string类型
var valueAsString = value.ToString();
//使⽤split(' ')空格来分隔输⼊值,统计⽣成字符串的数量。对数⽬⽐较验证。
if (valueAsString.Split(' ').Length>_maxWord)
{
return new ValidationResult("单词超过长度");  //string类型
}
}
return ValidationResult.Success;        //bool类型
}
}
第⼀个参数要验证对象中的值。后⾯进⾏逻辑的判断。这样做这⾥的错误提⽰不能显⽰到前台。我们需要修改下,使⽤ValidationAttrubute的ErrorMessage属性来⾃定义提⽰错误消息。
修改之后
public class MaxWordsAttribute:ValidationAttribute
{
private readonly int _maxWord;
public MaxWordsAttribute(int maxWord)
:base("{0} has too many words")
{
_maxWord = maxWord;
}
protected override ValidationResult IsValid(object value,ValidationContext validationContext)
{
if (value!=null)
{
//将输⼊转换为string类型
var valueAsString = value.ToString();
/
/使⽤split(' ')空格来分隔输⼊值,统计⽣成字符串的数量。对数⽬⽐较验证。validation框架
if (valueAsString.Split(' ').Length>_maxWord)
{
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;        //bool类型
}
}
[MaxWords(5)]
public string Address { get; set; }
这样效果就会将我们基类中的错误信息显⽰出来。
我们可以模型基础上添加⾃定义错误显⽰。
[MaxWords(5,ErrorMessage = "你输⼊的单词数超界限,请重新输⼊。")]
public string Address { get; set; }
这⾥需要注意这⾥的执⾏顺序,它是先执⾏模型上⾯的验证,接着在到控制器中的action中去的。利⽤ModelState.IsValid来进⾏验证。
⾃验证模型(IValidatableObject)
⾃验证模型是指⼀个知道如何验证⾃⾝的模型对象,可以让类实现IVaalidatableObject接⼝来实现对⾃⾝的验证。
public class Information:IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (UserName!=null&&UserName.Split(' ').Length>5)
{
yield return new ValidationResult("单词超界限了");
}
}
[Display(Name = "⽤户名")]
public string UserName { get; set; }
}
其实书上⾯是在错误返回值中返回的是string类型的数组,如下
yield return new ValidationResult("单词超界限了",new []{"UserName"});
可以我不知道从那⾥取出来这个错误消息。只能单独的显⽰出来。其实把错误消息放在数组中可以进⾏多模型的验证,从⽽统⼀将错误显⽰出来。
⾃⼰的感觉要是需要模型验证,最好还是进⾏第⼀种⽅法,最起码代码看起来⼲净,第⼆种给⼈的感觉是很乱,但是第⼆种适合⽐较模型多的场合。
我就是我,颜⾊不⼀样的烟⽕。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。