MVC学习手册之数据注解与验证
新建一个MVC5的WEB应用程序,VS2013会自动生成一段代码,以下是Account控制器下Register.cshtml 页面的代码:
@model WebApplication1.Models.RegisterViewModel
@{
ViewBag.Title = "注册";
}
<h2>@ViewBag.Title。</h2>
@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>创建新帐户。</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="注册" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
可以看到,通过调用HTML辅助方法,可以很方便的生成我们想要的html代码,并提供很方便的数据验证功能。这里只是简单的举一些常用的特性:
public class RegisterViewModel
{
[Required(ErrorMessage = "用户名是必须的")]
[Display(Name = "用户名")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "密码")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "确认密码")]
[Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]
public string ConfirmPassword { get; set; }
}
- Required 特性:用它标记的属性表示必须的,在数据验证时如果为空,则返回错误消息(通过 ErrorMessage 这个参数可以自定义返回的消息和消息类型)。
- Display 特性:它标记的属性,在调用Html辅助方法时会读取它的 Name 参数的值并显示。如上面的LabelFor(m=>m.UserName)它返回的就是 Name 参数的值。
- DataType 特性:它规定了所标记属性的数据显示类型, 在 DataType 这个枚举类型中定义了很多显示方式,如Password 表示以密码的方式显示,这样在用户输入密码时就不会以明文显示。
- StringLength 特性:它规定了所标记属性的的长度范围,如 Password 这个属性的最大长度为100个字符。
- Compare 特性:它修饰的属性可以与另一个属性相比较,如果它们的值相等,则返回true 否则为false ,如果为false 就返回 ErrorMessage 的值。如 ConfirmPassword 这个属性会自动与 Password 这个属性比较。
- RegularExpression 特性:正则表达式,用它修饰的属性会通过它将属性的值转换为正则表达式,在于所给定的参数比较,如果不相符,就返回 ErrorMessage 的值。
- Range 特性:它规定了所修饰的属性的值的可取值范围。如 [Range(34,43)]public int Age{get;set;} 那么Age的可取值为34到43,如果不在这个范围就返回 ErrorMessage 的值。
- Remote 特性:它所修饰的属性可以与远端服务器进行验证。如 [Remote("CheckUserName","Account")]public string UserName{get;set;} 会将UserName属性的值返回到服务器,并通过 Account 控制器下的 CheckUserName(string username)方法来进行处理。
前面讲完了一些基本的用于数据验证的特性操作(这些特性也叫做注解),那么接下来就来讲讲如何创建自定的验证操作:
自定义注解需要从 ValidationAttribute 派生自己类,并重写一个版本的 IsValid() 方法。如下面的例子创建了一个自定义的最大化的单词数的注解(特性):
public class MaxWordsAttribute : ValidationAttribute
{
private readonly int _maxWords;
public MaxWordsAttribute(int maxWords):base("{0}的单词数过多!")
{
_maxWords = maxWords;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
var valueAsString = value as string;
if (valueAsString.Split(' ').Length > _maxWords)
{
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;
}
}
通过空格将字符串分割为多个字符串,并计算子字符串的数目与限定的最大字符串数目比较,如果超过了限定,就返回 errorMessage 的值,在通过 FormatErrorMessage 方法重写了默认实现方式。
下面是被标记的UserName属性以及操作的结果:
[MaxWords(1)]
[Required(ErrorMessage = "用户名是必须的")]
[Display(Name = "用户名")]
public string UserName { get; set; }
类似的我们可以自定义其它注解与验证方式。
参考资料: ASP.NET MVC 5 高级编程(第5版)