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

原文地址:https://www.cnblogs.com/SilentCode/p/4943859.html