大数跨境
0
0

理解ASP.NET Core中的模型验证

理解ASP.NET Core中的模型验证 .NET之窗
2019-05-28
0
导读:了解并掌握ASP.NET Core中的模型验证

当MVC执行模型绑定后,为了验证绑定为参数提供的值是否符合预期,还需要进行模型验证。

 

一、理解模型验证

模型验证是指模型绑定后对Action参数进行验证的过程。它会根据事先定义的规则对参数的值进行验证,验证的结果可以通过ControllerBase类的ModelState属性获取,它的IsValid属性用来说明是否通过验证。

public IActionResult Create(Model model){    if (!ModelState.IsValid)    {        return View();    }
// 通过验证,继续执行后续逻辑}

 

二、数据注解与验证

设置验证规则最常见的方式是使用数据注解。数据注解包括一系列特性,这些特性均位于System.ComponentModel.DataAnnotations命名空间下。

public class User{    [Required]    public int Id { get; set; }    [Required, MinLength(2)]    public string FirstName { get; set; }    [Url]    public string Website { get; set; }    [DataType(DataType.Password)]    public string Password { get; set; }}

上例中用到了一些数据注解特性,如[Required]、[MinLength]、[Url]、[DataType]等,其中[Required]特性要求相应的属性值不能为空,必须提供;[MinLength]则可以指定属性值的最小长度;[Url]特性指明该属性的值必须是一个URL;[DataType]特性用于指明该属性的数据类型。

除了上面用到的特性外,数据注解还包含很多其他特性,在对用户提交的数据进行验证时,这些特性都非常有用。如果想要查看所有数据注解特性,可查看这里:https://docs.microsoft.com/dotnet/api/system.componentmodel.dataannotations

在使用数据注解特性时,我们可以为它们指定ErrorMessage属性,用于指明当该属性值验证失败时要显示的错误信息。

[Required(ErrorMessage = "用户名不能为空")][MinLength(2, ErrorMessage = "姓名不能少于2个字符")]

当为模型定义了数据注解特性后,为了在Action中验证参数是否符合规则,应首先检查ModelState.IsValid属性。

在视图中,为了显示错误消息,可以添加<div>或<span>元素,并结合asp-validation-summary以及asp-validation-for标签来分别显示所有错误消息汇总以及针对某个属性的错误消息。

<form asp-action="Create" method="post">    <div asp-validation-summary="All"></div>    <table>        <tr>            <td><label asp-for="Title"></label></td>            <td><input asp-for="Title" /></td>            <td><span asp-validation-for="Title"></span></td>        </tr>           </table>    <input type="submit" value="Create" /></form>

 

三、自定义验证规则

如果系统提供的验证特性满足不了我们的验证需求,ASP.NET Core允许通过两种方式来创建自定义验证规则,一种是创建继承自ValidationAttribute类的派生类,另一种是使用IValidatableObject接口。

举例来说,如果我们希望Model中某个属性的值必须以固定的字符串开始,则可以定义如下验证特性:

public class StartWithAttribute : ValidationAttribute{    public string StartValue { get; set; }    protected override ValidationResult IsValid(object value, ValidationContext validationContext)    {        if (value != null            && !string.IsNullOrWhiteSpace(StartValue)            && !value.ToString().StartsWith(StartValue))        {            return new ValidationResult($"字符串没有以{StartValue}开始");        }        else        {            return ValidationResult.Success;        }    }}

上例中,StartWithAttribute类继承自ValidationAttribute,并且重写了基类的ValidationResult方法,通过返回ValidationResult对象来说明验证是否成功。

提示:ValidationResult方法的ValidationContext参数表示验证上下文,通过它的ObjectInstance属性能够获取当前用于验证的模型(或实体对象)。

接下来,只要像使用系统验证特性一样使用它就可以:

[StartWith(StartValue = "Abc")]

另一种方式使用IValidatableObject接口,要使用这种方式,模型类需要实现这个接口。这个接口包含一个成员:

IEnumerable<ValidationResult>Validate(ValidationContext validationContext);

具体例子如下:

public class MovieIValidatable : IValidatableObject{    private const int _classicYear = 1960;
public int Id { get; set; }
[Required] [StringLength(100)] public string Title { get; set; }
[Required] public DateTime ReleaseDate { get; set; }
[Required] [StringLength(1000)] public string Description { get; set; }
[Range(0, 999.99)] public decimal Price { get; set; }
[Required] public Genre Genre { get; set; }
public bool Preorder { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Genre == Genre.Classic && ReleaseDate.Year > _classicYear) { yield return new ValidationResult( $"Classic movies must have a release year earlier than {_classicYear}.", new[] { "ReleaseDate" }); } }}

在Validate方法中,我们可以对所有需要自定义验证的属性进行判断、验证,并最终返回一个ValidationResult列表。

比较这两种方法,前一种主要针对一个属性进行验证,而后一种则可以对多个属性集中验证;前一种方法不需要修改模型类的源码(仅需要为属性添加特性),后一种方法则需要修改模型类的源码。具体要使用哪种方法,可根据实际情况而定。

 

总结

本文简单地讨论了ASP.NET Core的模型验证,模型验证用于确保数据符合事先设置的规则,能够避免不符合要求的数据,从而有效地保护应用程序。数据注解是为模型添加验证的主要手段,除了这种方式外,ASP.NET Core也允许添加自定义验证规则。



推荐阅读

理解ASP.NET Core中的模型绑定

理解ASP.NET Core的MVC模式

理解ASP.NET Core中的路由

理解ASP.NET Core中的中间件



-- End --

(如果您喜欢这篇文章,请您将它分享给更多的人)

【声明】内容源于网络
0
0
.NET之窗
分享与微软、.NET Core、Azure相关的技术。
内容 23
粉丝 0
.NET之窗 分享与微软、.NET Core、Azure相关的技术。
总阅读3
粉丝0
内容23