验证要做三件事

  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. linux常用关机/重启命令:shutdown,init 0,init 6

    目录 一.使用shutdown关机,重启,定时关机 二.使用init关机/重启 一.使用shutdown关机,重启,定时关机 1.设置计算机10分钟之后关机 [root@node5 ~]# shutd ...

  2. 解决 C# 连接oracle 读出中文乱码的问题

    一开始,我使用odbc连接oracle,发现中文变成了??,这种已经成了??的乱码是不能通过 Text.Encoding的方式来转码的. 1.我到处查资料,发现有说设置客户端 系统变量 把 远程服务器 ...

  3. .NET桌面程序混合开发之二:在原生WinFrom程序中使用WebView2

    本文将介绍如何在WinForms中嵌入WebView2,并讲到WebView2的主要特征.点击了解更多WebView2的API. 1. 准备 Visual Studio 2017 及以上版本 WebV ...

  4. scala的基本语法

    区分常量和变量 常量 变量 写一行代码,写多行代码,终端代码 数据类型 byte char short int long float double boolean  数据类型与java相似,但与jav ...

  5. docker构建镜像——Dockerfile

    from RUN CMD EXPOSE LABEL ENV COPY 格式 COPY [--chown=<用户>:<组>]<源>...<目的> COPY ...

  6. python数据分析练习--分析成都的房价

    目的:使用python的numpy.pandas.matplotlib库来分析成都二手房的房价信息. 原始数据来源:贝壳找房网站上的数据https://cd.ke.com/ershoufang 环境: ...

  7. 【Java】JVM字节码分析

    一.功能 1.工作原理 2.解释和运行 jvm本质上是运行在计算机上的程序,负责运行java字节码文件 对字节码文件中的指令,实时的解释成机器码,供计算机执行 3.内存管理 自动为对象.方法等分配内存 ...

  8. 代码审计——基础(JAVAEE)

    JAVAEE 目录 JAVAEE 常见框架 Struct2(控制层) Hibernate(持久层(与数据库交互)(不用再写简单的sql语句,但是需要一些列复杂的配置文件))(全ORM模型) Sprin ...

  9. Windows下cmd命令行ssh连接Linux服务器

    1.window+R键进入运行 2.输入cmd,运行命令行工具 3.使用,命令ssh连接服务器 ssh -t 用户名@ip地址 -p 22 例如: 输入密码,显示连接成功

  10. JS 过滤掉两个数组中对象id值相等的项

    const arr1 = [{ id: 1, name: '老二' }]; const arr2 = [{ id: 1, name: '网' }, { id: 2, name: '二位' },{ id ...