ASP.NET MVC5中的Model验证

时间:2022-12-16 14:50:33

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 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);
}
}

运行程序:

ASP.NET MVC5中的Model验证

注意,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 = "姓名")]
[Required(ErrorMessage = "姓名是必须的!")]
[MaxLength(, ErrorMessage = "太长了")]
public string Name { set; get; }
[Display(Name = "年龄")]
[CheckAge(, ErrorMessage = "年纪太小!")]
public int Age { set; get; }
}

然后运行程序:

ASP.NET MVC5中的Model验证

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 < )
{
yield return new ValidationResult("太年轻了!");
}
}
}

运行程序:

ASP.NET MVC5中的Model验证

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 < )
{
return "年纪尚轻!";
}
break;
}
return null;
}
} public string Error
{
get
{
//若返回值不是""或null,则不管数据是否合法,则验证都不会通过
//并且会在数据验证成功后显示此处指定的错误信息
return "";
//return "出错啦!";
}
}
}

运行程序:

ASP.NET MVC5中的Model验证
 
 

前端验证

 

上述验证均是在服务器端进行的,除此之外我们也可以使用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() 即可。

版权声明

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

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