首页 > 代码库 > ASP.NET MVC5中的Model验证

ASP.NET MVC5中的Model验证

Model验证是ASP.NET MVC中的重要部分,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。

  • DataAnnotation
  • ValidationAttribute
  • IValidatableObject
  • IDataErrorInfo

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 EBuy.Website.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默认为是必须的

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 = "姓名")]    [Required(ErrorMessage = "姓名是必须的!")]    [MaxLength(4, ErrorMessage = "太长了")]    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        {            return "出错啦!";        }    }}

运行程序:

技术分享

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接。

如有问题, 请发送邮件和作者联系。

ASP.NET MVC5中的Model验证