验证要做三件事

  1. 定义验证规则
  2. 按验证规则进行检查
  3. 报告验证的错误。

    在把错误报告给API消费者的时候,报告里并不包含到底是服务端还是API消费者引起的错误,这是状态码的工作。而通常响应的Body里面会包含一组验证错误信息,API消费者可以把这些信息展示给API消费者的用户。

定义验证规则

想要定义验证规则,我们可以使用ASP.NET Core内置的方式或者使用第三方库。

在ASP.NET Core里面,验证规则可以通过以下的方式来进行定义:

  • Data Annotations
  • 自定义Atrribute
  • 实现IValidatableObject接口

ASP.NET Core 内置了一个 ModelState对象,它用来做验证规则检查,如果规则验证不通过的话,ModelState.IsValid()方法就会返回false

一、Data Annotation

public class TripManager
{
[Key]
public int Id { get; set; }
[ForeignKey( "HotelID" )]
public Hotel Hotel { get; set; }
public int HotelID { get; set; }
[ForeignKey( "CarID" )]
public Car Car { get; set; }
public int CarID { get; set; }
[DataType( DataType.Date )]
public DateTime CheckInDate { get; set; }
[DataType( DataType.Date )]
public DateTime CheckOutDate { get; set; }
[Column( "TodaysPrice" )]
[Range( 10.30, 46.60 )]
public double Price { get; set; }
public Person Responsable { get; set; }
} public class Hotel
{
public int Id { get; set; }
[DisplayFormat( NullDisplayText = "无名称" )]
public string Name { get; set; }
} public class Person
{
public int Id { get; set; }
[Display(Name = "姓名")]
[StringLength( 50,MininumLength = 10, ErrorMessage = "{0}的长度为{1}-{2}" )]
public string Name { get; set; }
[NotMapped]
public List<Place> VisitedPlaces { get; set; }
} public class Car
{
public int Id { get; set; }
[Required(ErrorMessage = "{0}字段为必填")]
[MaxLength(100, ErrorMessage = "{0}的最大长度不能超过{1}"]
public string Model { get; set; }
public string Brand { get; set; }
}

ASP.NET Core 2.x 以前的验证写法

if(!ModelState.IsValid)
{
return UnprocessableEntity(ModeState);
}

ASP.NET Core 3.0 使用[ApiController]注解时就可以省略 2.x 这样的判断,有错则自动返回400错误

二、自定义Atrribute

public class TestAttribute:ValidationAttribute
{
protected override ValidationResult IsValid(object value,ValidationContext validationContext)
{
var dto=(Hotel)validationContext.objectInstance; //获取对象
if(Name == "傻蛋")
{
return new ValidationResult("不能叫这么Low的名字",new[]{ nameof(Hotel)});
}
return ValidationResult.Success;
}
} [Test]
public class Hotel
{
public int Id { get; set; }
public string Name { get; set; }
}

说明

  1. [Test]作用于属性时, value指要验证的属性, validationContext指的是对象
  2. [Test]作用于时, valuevalidationContext相同,都指的是对象

三、实现IValidatableObject接口

public class Hotel:IValidatableObject
{
public int Id { get; set; }
[Required]
public string Name { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(Name == "傻蛋")
{
yield return new ValidationResult("不能叫这么Low的名字",new[]{ nameof(Name)});
}
}
}

说明

先进行[ ]属性标签的验证,再时行Validate方法验证,Validate方法是“类”级别的。

ASP.NET Core 3.x 三种【输入验证】方式的更多相关文章

  1. asp.net core 系列 9 三种运行环境和IIS发布

    一.在asp.net core中使用多个环境 ASP.NET Core 配置是基于运行时环境, 使用环境变量.ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONME ...

  2. ASP.NET Core应用的7种依赖注入方式

    ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...

  3. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  4. asp.net中常用的几种身份验证方式

    转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html   前言 在B/S系统开发中,经常需要使用"身份验证&q ...

  5. ASP.NET Core 1.0: API的输入参数

    Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...

  6. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  7. python中的三种输入方式

    python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...

  8. Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...

  9. 如何为ASP.NET Core设置客户端IP白名单验证

    原文链接:Client IP safelist for ASP.NET Core 作者:Damien Bowden and Tom Dykstra 译者:Lamond Lu 本篇博文中展示了如何在AS ...

  10. 创建ASP.NET Core MVC应用程序(6)-添加验证

    创建ASP.NET Core MVC应用程序(6)-添加验证 DRY原则 DRY("Don't Repeat Yourself")是MVC的设计原则之一.ASP.NET MVC鼓励 ...

随机推荐

  1. Django——form组件的局部钩子

    如果对字段的校验条件太少,不能满足我们的需求,那么,我们可以对每个字段自定义校验的内容,就可以使用局部钩子. 局部钩子的使用方法: (1)导入错误类型 ----> 我们自己定义的钩子抛出的错误也 ...

  2. 基于WebSocket的modbus通信(一)- 客户端

    上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能. 但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应. 接下来要做的就是实现Modb ...

  3. centos7下利用qemu搭建arm模拟器

    1 目的 在centos7下使用qemu搭建arm模拟器. 参考博客: centos下利用qemu搭建arm模拟器 - 寒水司天 - 博客园 (cnblogs.com) 从零使用qemu模拟器搭建ar ...

  4. [SWPUCTF 2021 新生赛]easy_sql

    这道题呢就是很简单的sql注入,我们直接用sqlmap来跑. 首先我们打开页面可以看见提示,参数为wllm **然后我们启动虚拟机,输入sqlmap的命令:sqlmap -u "url地址/ ...

  5. go.mod file not found in current directory or any parent directory; see 'go help modules' (exit status 1)

    go.mod file not found in current directory or any parent directory; see 'go help modules' (exit stat ...

  6. Winform绘制圆形图

    1 private void Form_Load(object sender, EventArgs e) 2 { 3 PictureBox pic = new PictureBox(); 4 pic. ...

  7. es创建索引及别名更新mapping方法 elasticsearch [nested] nested object under path [XXX] is not of nested type

    [nested] nested object under path [XXX] is not of nested type这是因为在创建索引时没有指定类型为数组,这就是一个大坑,ES官方说可以不用指定 ...

  8. APOLLO DEV环境列表无法显示解决,重启对应的Apollo服务

    APOLLO DEV环境列表无法显示解决,重启对应的Apollo服务 找到项目中的apollo-core jar包中的配置文件,查看dev.meta的服务器配置IP:端口 apollo-env.pro ...

  9. python 日志写入文件

    import logging fmt = "%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s" ...

  10. Maven配置阿里云镜像和本地仓库路径

    配置阿里云镜像仓库 在settings > mirrors标签下添加以下内容 <!-- Aliyun Mirror --> <mirror> <id>alim ...