asp.net core的输入模型验证

楼主去做志愿者啦,最近才上班,荒废了将近一个月的时间,手和脑袋都退化了,今天跟大家一起学习下模型验证吧。

我们把数据存到数据库之前需要对数据进行验证,来判断它的格式、大小等,是否在我们允许的范围内。这其实时一个不小的工作量,为了减少我们的工作量,.net core提供了三种模型验证的方法。掌握它你就可以对数据进行360度无死角的验证,绝不漏掉任何死角。

其实我们对数据的验证时在我们模型绑定之后就立即开始的,在执行我们控制器Action中任何一行代码之前进行的。在我们开发Api的时候,这种验证更是全自动的,自动验证,自动回复验证错误。下面我们一起看一下这三种模型验证的方法,我用一个简单的例子来分别演示这三种操作。

一、验证标签

首先我们先准备一个例子,假设我们现在有个记录物品信息的系统,且提供一个Api可以将我们传过去的相关字段,存在数据库中,这个Action接受一个Product类型参数,参数通过模型绑定自动填充,完了进行数据的验证:

 Product类的定义如下:

 可以看到上面的截图中标红的部分,对数据进行了一些约束,除了我上面列出的标签,还有其他标签,用于验证,他们在System.ComponentModel.DataAnnotations;名字空间下。当我们调用到这个Action时,这些验证规则就会触发,如果验证失败,将返回相应的信息,标签中一个ErrorMessage参数,用它对提示信息进行格式化,否则将提示默认的英文。占位符{0}表示[Display(Name = "xx")]的值,后面的依次是标签中传入的参数。

下面我们用PostMan 来测试一下上面的例子,输入一些不能通过验证的信息,提示的信息如下:

很好奇我们为啥没做任何操作,自动短路了我们的操作,返回了验证的错误信息。这一切都归功于 [ApiController]这个标签,它作用于Controller,可以帮助我们自动实现模型绑定和验证。如果不要这个标签那么我们需要手动执行验证,操作如下:

这样我们的错误信息也能返回了。 

二、通过继承IValidatableObject接口

我们用Product类继承IValidatableObject,并实现Validate方法来验证输入的模型

现在假设我们有个需求,要求我们输入的备注(Remark字段)中必须要包含产品的名称(ProductName字段)的值,我们就可以这么去定义验证:

测试我们的验证规则是否生效:

可以看到,我们定义的规则已经生效,但是这边注意一点,我们通过接口定义的这个验证规则总是在标签验证后面执行的,也就是说如果标签验证没有通过,则这个验证将不去执行了,节省了开销。我们修改上面的请求,看一下结果:

可以看到,我只修改了邮箱,使得它不满足邮箱验证,并且备注中也并不包含产品名称,结果显示的错误只有这一条,后面的验证被短路,未执行。

三、自定义验证标签

如果不想用上面提到的两种验证规则,或者上面的操作不能帮你实现你奇妙的验证规则,那么我们可以通过这个方法来自定义一个标签,来实现验证。首先我们要新建一个类,实现ValidationAttribute类,在Override一下IsValid方法。细心的同学们可能已经发现了,我们的在方法一中用到的标签,也是通过这种方式来写的,下面我们就来实操一下吧。

现在来了一个需求,产品的单价低于100的不收,大于9999的不收,产品数量少于100个不收,大于500个也不收,代码如下:

现在只要我们把这个标签应用到我们的类上面就可以进行验证了,这边注意一点,我们自定义的标签可以作用在类上也可以作用在属性上面,但是需要我们根据实际情况,不要随便添。结果如下:

 以上就是.net core 提供给我们的三种进行模型验证的方式,除了以上的三种,其实还有另外一种方式FluentValidation,FluentValidation是一个非常流行的构建强类型验证规则的.NET库,由于篇幅有限,感兴趣的同学,可以自行学习和了解。

以上是我个人的理解整理而成,难免有疏漏和错误的地方,请谅解。

发布了32 篇原创文章 · 获赞 62 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/maaici/article/details/104558351