你的位置:首页 > ASP.net教程

[ASP.net教程]MVC学习手册之数据注解与验证


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版)