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里面的就不会返回了。
 

结束

posted @ 2020-03-23 20:37  高山-景行  阅读(594)  评论(3编辑  收藏  举报