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

时间: 02-15

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

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是一种跨平台的服务器端的嵌入式

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

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

.NET中的三种接口实现方式

摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接口实现.显式接口实现.混合式接口实现.这三种方式各有各的特点. 首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式.下面让我们来看一个隐式接口实现的例子: using System; internal class MyClass { public

Apache Spark探秘:三种分布式部署方式比较

目前Apache Spark支持三种分布式部署方式,分别是standalone.spark on mesos和 spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce,公用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配).本文将介绍这三种部署方式,并比

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

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

输入框三种输入方式(selenium webdriver 干货)

在机票预定的页面,输入出发城市和到达城市输入框的时候, 发现直接使用sendkeys不好使, 大部分情况出现输入某城市后没有输入进去, 经过几天的研究,发现可以采取三种方式: 1. 先点击输入框,待弹出 城市选择框之后,点击相应的城市 2. 缓慢输入城市的缩略字母或者城市的名字的部分,会显示出待选城市的下拉列表,进而从下拉列表中选择相应的城市. 3. 直接执行 js脚本对input的value设置为想要的值 首先说一下第三种方式: JavascriptExecutor js = (Javascr

jQuery自动补全插件使用,三种获取数据源方式

jQuery有很多很多的已经实现,很漂亮的插件,autocomplete就是其中之一.jQuery ui autocomplete主要支持字符串Array.JSON两种数据格式. 主要参数: Source:数据源,类型为String.Array.Function,其中String为ajax请求的服务器端地址,返回Array/JSON格式,Array即为数组,静态定义到页面中的数据,下面会有具体的  demo, Function(request,response):通过request.term获得

VMware运行Ubuntu 三种网络连接方式:bridge、NAT、Host-Only的区别【转】

原:http://villasy1989.iteye.com/blog/956746 我的Host是Windows7,安装VMware虚拟机,在虚拟机中装了Ubuntu10.04,首先介绍下VMware下的几个虚拟设备: VMnet0:VMware用于虚拟桥接网络下的虚拟交换机: VMnet1:VMware用于虚拟Host-Only网络下的虚拟交换机: VMnet8:VMware用于虚拟NAT网络下的虚拟交换机: VMware Network Adapter VMnet1:这是Host用于与Ho