P27 输入验证:IValidatableObject
这次准备讲下IValidatableObject
再讲它之前要先讲一下原理性的内容
上一节我们这里并没有判断ModelState.IsValid
.net core 2.0的版本是这么写的
.net core 3.0没有写,dto发生了验证错误。422状态码以为错误信息都会返回给客户端,这是为什么呢?
这是因为我们的Controller使用了ApiController进行了注解。所以所说当model进行绑定的时候,model上的各个属性注解就会被检查,所以说当model验证有错误的时候。
400状态码就会自动的被返回。与他一同返回的还有在body里这些错误的信息。
今天我们以Emoloyee这个类,已经加上一些属性的验证。

实现IValidatableObject接口,并且

实现接口的方法

这个接口就这一个方法。在里面就可以定义一些相对复杂的验证规则。

如果姓和名相同的话,我们就返回错误信息 通过yield return一个ValidationResult里面是错误信息。


然后要指定这个验证错误是争对哪个属性引起的。下面这样就是认为它是一个类级别的错误。

参数是一个数组,也可以认为是 这两个属性的错误

添加某个公司下的员工信息
这一段代码,视频中没有体现,单独找到博主的github的地址 又自己写了一遍。
https://github.com/Surbowl/ASP.NET-Core-RESTful-Note/blob/master/Routine/Routine.APi/Controllers/EmployeesController.cs


[HttpPost(Name = nameof(CreateEmployeeForCompany))] public async Task<IActionResult> CreateEmployeeForCompany([FromRoute]Guid companyId,[FromBody]EmployeeAddDto employee) { //这里的[FromRoute] 和 [FromBody]不指定也可以,会自动匹配 //var data = await _companyRespository.GetCompanyAsync(companyId); if (!await _companyRespository.CompanyExistsAsync(companyId)) { return NotFound(); } var entity = _mapper.Map<Employee>(employee); _companyRespository.AddEmployee(companyId, entity); await _companyRespository.SaveAsync(); var returnDto = _mapper.Map<EmployeeDto>(entity);//返回的数据是EmployeeDto return CreatedAtAction(nameof(GetEmployeeForCompany), new { companyId = returnDto.CompanyId, employeeId = returnDto.Id },returnDto); }
测试
{ "employeeNo": "0123456789", "firstName":"三11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "lastName":"三", "gender":1, "dateOfBirth":"1998-12-24" }

故意把姓和名改成一样的测试


姓和名最大长度默认不能超过50。故意把长度写的很长。


当dto类里面DataAnnoation里面有不合法的Validate里面的就不会返回了。
结束
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-03-23 20个Flutter实例视频教程-第07节: 毛玻璃效果制作
2019-03-23 20个Flutter实例视频教程-第06节: 酷炫的路由动画-2