ASP.NET Core 3.x 三种【输入验证】方式

验证要做三件事

  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方法是“类”级别的。

原文地址:https://www.cnblogs.com/zhaoshujie/p/12312005.html

时间: 2024-11-04 03:03:38

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

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

与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/Home/Index 发现是404没有找到该页面,因为我们还没有为其配置路由,下面使用两种配置区域路由的方式 1.通过配置MapRoute app.UseMvc(routes => { routes.MapRoute( name: "default", template: "

ASP、JSP、PHP 三种技术比较

ASP.JSP.PHP 三种技术比较 目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(JavaServer Pages),PHP (Hypertext Preprocessor). 简 介 : ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的.互动的.高性能的WEB服务应用程序.ASP采用脚本语言VBScript(Java script)作为自己的开发语言. PHP是一种跨平台的服务器端的嵌入式

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

本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该输入数据按指定的输入格式被赋给相应的输入项.函数一般格式为:scanf("控制字符串",输入项列表):其中控制字符串规定数据的输入格式,必须用双引号括起,其内容是由格式说明和普通字符两部分组成.输入项列表则由一个或多个变量地址组成,当变量地址有多个时,各变量地址之间用逗号“,”分隔.sca

Asp.net Core, 基于 claims 实现权限验证 - 引导篇

什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html http://www.cnblogs.com/savorboard/p/aspnetcore-identity.html clai

三种网络数据传输方式比较(byte stream,protobuf,json)

三种网络数据传输方式比较(byte stream,protobuf,json) 2014-08-27 10:39:04 分类: LINUX 原文地址:三种网络数据传输方式比较(byte stream,protobuf,json) 作者:yuyunliuhen 针对于tinynet进行了三种数据传输方式的测试,包括最初的byte stream,protobuf,以及比较流行json方式.跟之前的几次测试一样,模型为echo模型,都是以epoll为例,每个连接每秒发送10个包,每个数据包约100by

RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期

RHEL7.CentOS7提供三种命令行方式方式来设置和显示日期.时间.timedatectl是在RHEL7及CentOS7中新增的systemd的一部分,date是传统的日期时间设置命令,hwclock单元访问的是硬件时钟. 一.timedatectl [root@Geeklp-Administrator ~]# timedatectl Local time: 六 2017-12-16 19:49:53 CST Universal time: 六 2017-12-16 11:49:53 UTC

js默认三种弹框方式

<!--js默认三种弹框方式--> <!--警告--><div onclick="alert('警告')">onclick!</div> <!--确认--><div onclick="confirm('确认')">onclick!</div> <!--信息输入--><div onclick="prompt('信息输入')">onclick!

LVS:三种负载均衡方式比较+另三种负载均衡方式

转:http://blog.csdn.net/u013256816/article/details/50705578 什么是LVS? ??首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的.高可用的虚拟服务器.整个服务器集群的结构对客户是透明的,而且无需修

三种加载方式

重点总结:    即:三种加载方式    1>传统加载方式------默认路径:tomcat/bin/目录    2>使用ServletContext对象-----默认路径:web应用(工程)目录    3>使用类加载器------默认路径:WEB-INF/classes/目录 一.利用ServletContext对象读取资源文件--默认目录为:工程(应用)路径                重点方法:                        InputStream getReso