美文网首页程序员
ASP.NET MVC5中的Model验证

ASP.NET MVC5中的Model验证

作者: 雪飞鸿 | 来源:发表于2016-10-13 13:13 被阅读854次

    Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。


    后台验证

    DataAnnotation

    DataAnnotation翻译过来是“数据注解”的意思,DataAnnotation命名空间中包含一些用于验证Model的特性,如:RequiredAttribute,CompareAttribute,DisplayAttribute等,我们在创建Model时,将相应的特性性标注到字段上即可实现数据验证。

    创建Model

    public class Person
    {
        [Display(Name = "姓名")]
        [Required(ErrorMessage = "姓名是必须的!")]
        public string Name { set; get; }
        [Display(Name = "姓名")]
        public int Age { set; get; }
    }
    

    View中的代码:

    @model Models.Person
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <div>
            <h3 style="color:red;">
                @Html.ValidationSummary()
            </h3>
        </div>
        <div>
            @using (Html.BeginForm("evaluate", "home", "Post"))
            {
                @Html.LabelFor(Model => Model.Name)
                @Html.TextBoxFor(Model => Model.Name)
                @Html.LabelFor(Model => Model.Age)
                @Html.TextBoxFor(Model => Model.Age)
                <input type="submit" value="提交" />
            }
        </div>
    </body>
    </html>
    

    Controller中的代码:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Evaluate(Person person)
        {
            if (ModelState.IsValid)
            {
                return Content("evaluate success!");
            }
            return View("Index", person);
        }
    }
    

    运行程序:

    验证结果
    注意,Age属性上并未标注RequiredAttribute,却依然提示Age字段必须,这是因为Age是int类型,int类型不能为null,对于不能为null的类型,ASP.NET MVC默认为是必须的。除此之外,ASP.NET MVC还会帮助我们进行数据类型的验证,如,若在年龄一栏输入非整数,那么验证将不会通过,且会提示数值不合法。

    ValuationAttribute

    除了使用DataAnnotation中预定义的一些特性进行数据验证外,我们还可以自定义验证特性。这里我们通过覆写DataAnnotation命名空间中ValudationAttribute类的IsValid方法来实现自定义验证。示例代码如下:

    public class CheckAgeAttribute : ValidationAttribute
    {
        private int _minage;
        public CheckAgeAttribute(int minAge)
        {
            _minage = minAge;
        }
        public override bool IsValid(object value)
        {
            if (value is int)
            {
                var age = value as int?;
                if (age == null)
                {
                    return false;
                }
                if (age < _minage)
                {
                    return false;
                }
                return true;
            }
            return false;
        }
    
        public override string FormatErrorMessage(string name)
        {
            return base.FormatErrorMessage(name);
        }
    }
    

    标注特性:

    public class Person
    {
        [Display(Name = "姓名")]
        public string Name { set; get; }
        [Display(Name = "年龄")]
        [CheckAge(18, ErrorMessage = "年纪太小!")]
        public int Age { set; get; }
    }
    

    然后运行程序:


    执行结果

    IValidatableObject

    通过实现IValidatableObject接口进行数据的验证,示例代码如下:

    public class Person : IValidatableObject
    {
        [Display(Name = "姓名")]
        public string Name { set; get; }
        [Display(Name = "年龄")]
        public int Age { set; get; }
    
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            Person person = validationContext.ObjectInstance as Person;
            if (person == null)
            {
                yield break;
            }
            if (string.IsNullOrEmpty(person.Name))
            {
                yield return new ValidationResult("您贵姓?");
            }
            if (person.Age < 18)
            {
                yield return new ValidationResult("太年轻了!");
            }
        }
    }
    

    运行程序:


    执行结果

    IDataErrorInfo

    实现IDataErrorInfo接口也可以进行数据的验证,示例代码如下:

    public class Person : IDataErrorInfo
    {
        [Display(Name = "姓名")]
        public string Name { set; get; }
        [Display(Name = "年龄")]
        public int Age { set; get; }
    
        public string this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case "Name":
                        if (string.IsNullOrEmpty(Name))
                        {
                            return "雁过留声,人过留名";
                        }
                        return null;
                    case "Age":
                        if (Age < 18)
                        {
                            return "年纪尚轻!";
                        }
                        break;
                }
                return null;
            }
        }
    
        public string Error
        {
            get
            {
                //若返回值不是""或null,则不管数据是否合法,则验证都不会通过
                //并且会在数据验证成功后显示此处指定的错误信息
                return "";
                 //return "出错啦!";
            }
        }
    }
    

    运行程序:


    执行结果

    前端验证

    上述验证均是在服务器端进行的,除此之外我们也可以使用js在客户端进行数据的验证。除了我们自己手写js代码外,ASP.NET MVC也提供了前端验证方法,要启用ASP.NET MVC提供的前端验证方法需要在页面中引入三个js文件:

    • jquery-1.10.2.min.js(也可以是其它版本的jQuery)
    • jquery.validate.min.js
    • jquery.validate.unobtrusive.min.js

    然后在配置文件中开启客户端验证(默认是开启的):

    <configuration>
        <appSettings>
           <add key="ClientValidationEnabled" value="true"/>
           <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
    </configuration>
    

    注意:若要使ASP.NET MVC提供的前端验证生效,需要对Model进行数据注解(DataAnnotation)。
    引用文件之后,运行程序,然后查看页面源代码,可以看到form中的input标签中多出了data-val属性以及其它的和数据注解相关的属性。

    对于验证失败的信息,我们需要对用户进行相应的提醒。只需要在<form></form>中添加@Html.ValidationSummary()即可。

    相关文章

      网友评论

        本文标题:ASP.NET MVC5中的Model验证

        本文链接:https://www.haomeiwen.com/subject/ieqiyttx.html