ASP.NET Core 3.x 三种【输入验证】方式
验证要做三件事
- 定义验证规则
- 按验证规则进行检查
- 报告验证的错误。
在把错误报告给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; }
}
说明
- 当
[Test]作用于属性时,value指要验证的属性,validationContext指的是对象 - 当
[Test]作用于类时,value和validationContext相同,都指的是对象
三、实现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 三种【输入验证】方式的更多相关文章
- asp.net core 系列 9 三种运行环境和IIS发布
一.在asp.net core中使用多个环境 ASP.NET Core 配置是基于运行时环境, 使用环境变量.ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONME ...
- ASP.NET Core应用的7种依赖注入方式
ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...
- Asp.Net Core下的两种路由配置方式
与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...
- asp.net中常用的几种身份验证方式
转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html 前言 在B/S系统开发中,经常需要使用"身份验证&q ...
- ASP.NET Core 1.0: API的输入参数
Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
- Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...
- 如何为ASP.NET Core设置客户端IP白名单验证
原文链接:Client IP safelist for ASP.NET Core 作者:Damien Bowden and Tom Dykstra 译者:Lamond Lu 本篇博文中展示了如何在AS ...
- 创建ASP.NET Core MVC应用程序(6)-添加验证
创建ASP.NET Core MVC应用程序(6)-添加验证 DRY原则 DRY("Don't Repeat Yourself")是MVC的设计原则之一.ASP.NET MVC鼓励 ...
随机推荐
- Bear and String Distance
传送锚点: codeforces.com Copy 4 26 bear output roar input 2 7 af output db input 3 1000 hey output -1 思路 ...
- WNS 后台Push服务调试脚本
一.API说明 https://cloud.tencent.com/document/product/276/3212 二.推送脚本 #!/usr/local/bin/python3 # -*- ...
- nodejs koa框架下载和导入excel
ac.js const service = require("../service/model.service"); const urlencode = require(" ...
- 恢复Everything的默认排序
在窗口里点了文件名/时间排序后,想恢复默认排序: 点击菜单 ,视图-排序-最近打开时间.
- 高可用集群MHA方案
爱奇艺在用的数据库高可用方案 MHA 是目前比较成熟及流行的 MySQL 高可用解决方案,很多互联网公司正是直接使用或者基于 MHA 的架构进行改造实现 MySQL 的高可用. MHA 能在 30 秒 ...
- sshd服务部署
sshd服务部署 软件安装修改配置文件启动使用 1.搭建所有服务的套路 关闭防火墙和selinux(实验环境都先关闭掉) 配置yum源(公网源或者本地源) 软件安装和检查 了解并修改配置文件 启动服 ...
- 判断一个数n是不是快乐数
引言 题目:编写一个算法来判断一个数n是不是快乐数 来源:网友分享的面试算法题 题目描述 [快乐数定义] 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和. 然后重复这个过程直到这个数变为 ...
- mybatis Selective动态判断属性值新增或修改操作,batch批量操作
mybatis Selective动态判断属性值新增或修改操作,batch批量操作 mybatis insert foreach批量添加https://www.cnblogs.com/oktokeep ...
- linux日志查询less及堡垒机查询日志方法
方法1tail -f orderFile.log | grep "关键字" postman接口请求的时候,关注控制台对关键字过滤的打印输出. 方法2less 文件名称/ 关键字n ...
- 以沙箱的方式运行容器:安全容器gvisor
目录 一.系统环境 二.前言 三.安全容器隔离技术简介 四.Gvisor简介 五.容器runtime简介 六.docker容器缺陷 七.配置docker使用gVisor作为runtime 7.1 安装 ...