在asp.net core中使用的验证框架FluentValidation

FluentValidation在asp.net core中怎么使用?

先安装包。

Install-Package FluentValidation.AspNetCore

和上一篇的实体类和验证类一样。

实体类:

public class Person
{public int Id { get; set; }public string Name { get; set; }public string Tel { get; set; }public string Email { get; set; }public DateTime Birthday { get; set; }public string IDCard { get; set; }public PersonAddress Address { get; set; }
}
public class PersonAddress
{public string Country { get; set; }public string Province { get; set; }public string City { get; set; }public string County { get; set; }public string Address { get; set; }public string Postcode { get; set; }
}

验证类:

/// <summary>
/// Person验证
/// </summary>
public class PersonValidator : AbstractValidator<Person>
{public PersonValidator(){RuleFor(p => p.Name).NotNull().NotEmpty();RuleFor(p => p.Email).NotNull().EmailAddress();RuleFor(p => p.Birthday).NotNull();RuleFor(p => p.IDCard).NotNull().When(p => (DateTime.Now > p.Birthday.AddYears(1))).WithMessage(p => $"出生日期为{p.Birthday},现在时间为{DateTime.Now},大于一岁,CardID值必填!").NotEmpty().When(p => (DateTime.Now > p.Birthday.AddYears(1))).WithMessage(p => $"出生日期为{p.Birthday},现在时间为{DateTime.Now},大于一岁,CardID值必填!").Length(18).When(p => (DateTime.Now > p.Birthday.AddYears(1)));RuleFor(p => p.Tel).NotNull().Matches(@"^(\d{3,4}-)?\d{6,8}$|^[1]+[3,4,5,8]+\d{9}$");RuleFor(p => p.Address).NotNull();RuleFor(p => p.Address).SetValidator(new PersonAddressValidator());}
}
/// <summary>
/// Person Address验证
/// </summary>
public class PersonAddressValidator : AbstractValidator<PersonAddress>
{public PersonAddressValidator(){RuleFor(a => a.Country).NotNull().NotEmpty();RuleFor(a => a.Province).NotNull().NotEmpty();RuleFor(a => a.City).NotNull().NotEmpty();RuleFor(a => a.County).NotNull().NotEmpty();RuleFor(a => a.Address).NotNull().NotEmpty();RuleFor(a => a.Postcode).NotNull().NotEmpty().Length(6);}
}

Starup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddControllers().AddFluentValidation();services.AddTransient<IValidator<Person>, PersonValidator>();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "FluentValidationWebDemo01", Version = "v1" });});
}

这里和asp.net core mvc的模型验证如出一辙。

 [ApiController][Route("[controller]")]public class HomeController : ControllerBase{private readonly ILogger<HomeController> _logger;private readonly IValidator<Person> _validator;public HomeController(ILogger<HomeController> logger, IValidator<Person> validator){_validator = validator;_logger = logger;}[HttpPost("/addperson")]public IActionResult AddPerson([FromBody] Person person){_logger.LogInformation("添加Person");if (ModelState.IsValid){return Ok("验证成功后,假装这里作了后端业务处理");}_logger.LogError("验证Person失败");return BadRequest("person没有验证通过");}}

测试传入数据:

{"id":0,"birthday":"2021-03-29T07:00:18.061Z","idCard":"","name":"","email":"axzxs2001163.com","tel":"1345346714","address":{"country":"中国","province":"山西","city":"","county":"古城","address":"","postcode":"04600"}
}

结果:

{"type": "https://tools.ietf.org/html/rfc7231#p-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "00-21fffead3f693fdf9156d796baf4e4ef-a7d39f85acf57cff-00","errors": {"Tel": ["'Tel' 的格式不正确。"],"Name": ["'Name' 不能为空。"],"Email": ["'Email' 不是有效的电子邮件地址。"],"Address.City": ["'City' 不能为空。"],"Address.Address": ["'Address' 不能为空。"],"Address.Postcode": ["'Postcode' 必须是 6 个字符,您输入了 5 字符。"]}
}

还是那句话,FluentValidation提供了更灵活,完强大的验证方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EFCORE笔记】异步查询工作原理注释标记

异步查询 当在远程数据库中执行查询时&#xff0c;同步查询可能会阻止当前线程&#xff0c;异步查询可避免阻止线程&#xff0c;这有助于避免冻结户端界面&#xff0c; 异步操作还可以增加 Web 应用程序的吞吐量&#xff0c;可以在数据库操作完成前释放线程去处理其他请求。EF …

CSS日常公用样式与一些解决方案

一、自己总结的公用样式解析html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, form, input, select, button, textarea, iframe, table, th, td { margin: 0; padding: 0; }img { border: 0 none; vertical-align: top; }ul, li { list-style-type: none; }h1…

上班族吐槽大集合:那些发生在公司的傻X奇遇

“明明不需要加班&#xff0c;到了点却偏偏没人起身走。”—— 小爱“头脑风暴&#xff0c;人越多效率越低下&#xff0c;最后风暴出来的东西也很难落实。”—— 好奇心“只是申请个办公用品&#xff0c;需要人事处签字&#xff0c;行政部签字&#xff0c;总监签字&#xff0c;…

C# 9 record 并非简单属性 POCO 的语法糖

最近升级专案到大统一 .NET 5 并使用 C#9 语法尝试改写套件,发现之前以为 record 只是简单属性 POCO 的简化语法糖的认知是错误。另外因为 POCO 属于需定义口语词&#xff0c;这边在本文定义简单属性 POCO 为 public class 类别 {public string ID{get;set}/*略*/} 只有属性的简…

java实现思维导图_Java并发(思维导图)

1&#xff0c;线程状态转换无限期等待&#xff1a;限期等待&#xff1a;线程生命流程&#xff1a;2&#xff0c;实现方式代码实现样例【三种方式】&#xff1a;packagecom.cnblogs.mufasa.demo2;importjava.util.concurrent.Callable;public class test1_Runnable implementsRu…

这本免费小书,带你征服 GitHub!

GitHub 漫游指南&#xff0c;一本有趣又通俗的 GitHub 教程&#xff0c;想要成为 star 之王么&#xff1f;今天给大家分享一份通俗易懂的 GitHub 学习教程&#xff0c;即《GitHub 漫游指南》。看过了不下十套 GitHub 教程了&#xff0c;小编愿称它为最强&#xff01;虽然没有 G…

jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器

更新记录: 2011/6/5 jQuery formValidator 4.1.0 ver申明&#xff1a;1、所有DEMO引用jQuery类库的时候&#xff0c;类库后面直接跟了版本号——表示插件支持的最高类库版本号2、插件的命名&#xff1a;插件名版本号&#xff0c;压缩版&#xff1a;插件名版本号min新增以下功能…

java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。看了下netty 源代码, 终于明白了Channel.write() 和 ChannelHandlerContext.write() 的区别了网上说的都不是很清楚首先注明我的netty版本io.nettynetty-all4.0.36.FinalChannelPipeline处理ChannelH…

美国劳工部揭露中国女人大数据,看完彻底傻眼了……

导读&#xff1a;“中国人的勤奋&#xff0c;令世界惊叹和汗颜&#xff0c;甚至有一点恐惧。”——科斯&#xff0c;诺贝尔经济学奖得主那么中国人的“勤奋”能否用数据来量化一下呢&#xff1f;答案是可以的。另外&#xff0c;如果以性别来区分&#xff0c;究竟是中国男性更勤…

计算机女神,互联网第一夫人!

大家好&#xff0c;我是鱼皮&#xff0c;今天带大家认识一位计算机领域的女神&#xff0c;有关她的故事非常有趣&#xff01;先聊聊我是如何认识女神的吧。那是我在大四做毕业设计的时候&#xff0c;误打误撞地选了一个图像处理相关的课题&#xff0c;要做一个显微图像处理分析…

NET问答: 如何从 string 中挖出所有的 number ?

咨询区 van:我现在有一个需求&#xff0c;想从 string 中找到所有的 number 并提取出来。举例如下&#xff1a;string test "1 hello" string test1 " 1 world" string test2 "helloworld 99"请问我该如何做&#xff1f;回答区 Tabares:这个简…

大数据告诉你:学历真的能改变命运

央视新闻曾做过关于高考的调查&#xff0c;结果有七成网友支持高考取消数学&#xff0c;看到新闻后&#xff0c;有一位网友却一针见血地评论道&#xff1a;数学考试存在的意义就是把这七成网友筛选掉。的确&#xff0c;虽然买菜不需要专业数学知识&#xff0c;但数学可以决定我…

mysql控制台教程视频教程_mysql 控制台操作

一、连接mysql数据库1.首先打开cmd进入dos窗口2.切换至目录&#xff1a;D:\MySql5.0\mysql-5.0.51b-win32\bin(即&#xff1a;mysql安装目录下面的bin目录&#xff0c;该目录内有很多exe执行文件)3.键入命令&#xff1a;mysql -uroot -p 回车&#xff0c;提示输入密码&#xff…

Dapr微服务应用开发系列5:发布订阅构建块

题记&#xff1a;这篇介绍发布订阅构建块&#xff0c;这是对事件驱动架构设计的一种实现落地。注&#xff1a;对于“Building Blocks”这个词组的翻译&#xff0c;我之前使用了“构件块”&#xff0c;现在和官方文档&#xff08;Dapr中文社区的贡献&#xff09;保持一致&#x…

【资源】机器学习资料包来袭

近几年&#xff0c;机器学习一直很火&#xff0c;小编也有意识地收集了机器学习相关的资源&#xff0c;经过长时间的积累和沉淀&#xff0c;已经拥有将近17G的吴恩达老师、李宏毅老师和王保明老师机器学习资料和视频。现在&#xff0c;小编准备将这些资料免费分享给大家&#x…

java 字符串 去除_java 字符串中去除特定的字符

java String字符串 去除特定的字符 程序如下package com.xing.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/**** author Yinxing**/public class NotString {public static void main(String[] args) {// TODO Auto-generated method stubString st…

深度学习了40万个表情,一大波AI 表情包来了

自从有了表情包&#xff0c;跟人聊天时的第一反应&#xff0c;就是去找找看有什么适合的表情。有一类表情包&#xff0c;形式是文字图&#xff0c;尤其能够精妙地抒发和传递感情。在这一点上&#xff0c;可能全世界的网友都一样。好用的表情永远不嫌多&#xff0c;而且似乎总是…

网关Ocelot功能演示安排的明明白白~~~

前言网关(Gateway)在微服务架构中至关重要&#xff0c;可以将其理解为是外部客户端(前端、MVC后台等调用方)与后台服务的连接点&#xff0c;通过这层可以做统一的处理&#xff0c;比如路由、身份认证和授权、服务治理等&#xff1b;网关的好处&#xff1a;统一入口&#xff0c;…

通过Dapr实现一个简单的基于.net的微服务电商系统

本来想在Dpar 1.0GA时发布这篇文章&#xff0c;由于其他事情耽搁了放到现在。时下微服务和云原生技术如何如荼&#xff0c;微软也不甘示弱的和阿里一起适时推出了Dapr&#xff08;https://dapr.io/&#xff09;&#xff0c;园子里关于dapr的文章不太多&#xff0c;所以今天就借…

基于 Python 自建分布式高并发 RPC 服务

RPC&#xff08;Remote Procedure Call&#xff09;服务&#xff0c;也即远程过程调用&#xff0c;在互联网企业技术架构中占据了举足轻重的地位&#xff0c;尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下&#xff0c;RPC 更扮演了重要角色。Google 开源了 gRPC…