数据校验

简介:

校验介绍

一个应用的输入应该首先要验证。这个输入可以是用户的输入,也可以是另一个应用的输入。在一个Web应用中,验证通常要实现2次:第一次是客户端验证,第二次是服务端验证。客户端的验证是为了更好的用户体验,通过检测表单的字段来提醒用户必须的字段;服务端的验证是更严格且无法避免的。

服务端的验证是在应用服务层实现的。应用服务方法应该首先检查(验证)输入然后在使用。ABP提供了一个不错的基础设施来验证应用服务方法的输入。

输入服务方法以一个DTO对象作为输入参数。ABP提供了一个DTO可以实现的IValidate接口来自动验证它们。因为IInputDto扩展了IValidate,因此输入DTOs可以只实现IInput来确保验证。

使用数据注解

ABP支持数据注解,ABP通过MethodInvocationValidator对服务层方法参数拦截,需要实现验证的方法,使用ValidationInterceptor进行拦截。对应的源码在 Abp.Runtime.Validation.Interception命名空间。

现在我在CityInput文件中添加一个类CreateCityInput,代码如下:

复制代码
public class CreateCityInput : IInputDto, IShouldNormalize
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Code { get; set; }
    [Required]
    public string ProvinceCode { get; set; }
    public DateTime UpdatedTime { get; set; }
    public string UpdatedBy { get; set; }

    public void Normalize()
    {
        if (UpdatedTime==null)
        {
            UpdatedTime=DateTime.Now;
        }
    }
}
复制代码

CreateCityInput类实现了IInput和IShouldNormalize接口,并且在Name,Code,ProvinceCode是必填字段,最后实现了IShouldNormalize接口中的Normalize方法,判断了UpdatedTime是否为null,如果是null,就赋值为当前的时间。

在ICityAppService服务接口中添加方法:

void CreateCity(CreateCityInput input);

在CityAppService中实现该接口的此方法:

复制代码
public void CreateCity(CreateCityInput input)
{
    var city = _cityRepository.FirstOrDefault(c => c.Name == input.Name);
    if (city != null)
    {
        throw new UserFriendlyException("该城市数据已经存在!");
    }
    city = new Cities() { Code = input.Code, Name = input.Name, ProvinceCode = input.ProvinceCode };
    _cityRepository.Insert(city);
}
复制代码

在CityController中添加Create方法:

复制代码
public ActionResult Create()
{
    var input = new CreateCityInput()
    {
        Name = "温州",
        ProvinceCode = "1",
        Code = "3",
    };
    _cityAppService.CreateCity(input);
    return Content("OK");
}
复制代码

这里,我们创建了一个CreateCityInput对象,并给三个必填字段赋值,然后调用服务接口的方法,如果服务方法执行成功,就向页面返回OK。

image

image

方法执行成功,数据库中也成功添加了数据。

现在我们不给这三个必填字段之一赋值,修改CityController代码如下:

复制代码
public ActionResult Create()
{
    var input = new CreateCityInput()
    {
        Name = "台州",
        //ProvinceCode = "1",
        Code = "3",
    };
    _cityAppService.CreateCity(input);
    return Content("OK");
}
复制代码

image

结果报错了,错误是“方法实参无效!请看验证错误细节。”可见,添加数据注解的属性因为不符合条件而产生的错误被成功拦截。ABP也会检测输入是否为null,如果为null,就抛出AbpValidationException异常。因此,不必写检测null的代码。如果输入的属性之一是无效的,也会抛出相同的异常。

这种机制和ASP.NET MVC的验证机制很相似,但是注意应用服务类不是派生自Controller类的,它是一个普通的类并且可以独立于web工作。

自定义验证

如果数据注解还不能满足你的需求的话,你也可以实现ICustomValidate接口:

复制代码
public class CreateCityInput : IInputDto, IShouldNormalize,ICustomValidate
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Code { get; set; }
    [Required]
    public string ProvinceCode { get; set; }
    public DateTime UpdatedTime { get; set; }
    public string UpdatedBy { get; set; }

    public void Normalize()
    {
        if (UpdatedTime==null)
        {
            UpdatedTime=DateTime.Now;
        }
    }

    public void AddValidationErrors(List<ValidationResult> results)
    {
        if (ProvinceCode.Length>5)
        {
            results.Add(new ValidationResult("省份编码长度不能超过5个字符!"));
            throw new Exception("省份编码长度不能超过5个字符!");
        }
    }
}
复制代码
复制代码
public ActionResult Create()
{
    var input = new CreateCityInput()
    {
        Name = "衢州",
        ProvinceCode = "123456",
        Code = "4",
    };
    _cityAppService.CreateCity(input);
    return Content("OK");
}
复制代码

这里代码很简单,不用多做解释,(有问题的话直接评论区提问),直接测试一下。

image

 

标准化

标准化就是在验证之后,进行一些额外的操作。其实前面的代码已经标准化了,ABP定义了一个

具有Normalize方法的IShouldNormalize接口。如果实现了这个接口,Normalize方法就会在验证之后调用。正如之前的示例代码:

复制代码
public void Normalize()
{
    if (UpdatedTime==null)
    {
        UpdatedTime=DateTime.Now;
    }
}
复制代码

这个作用就是,数据验证之后,如果UpdatedTime属性值为null,那么就把当前时间给它。当然,客户端传过来的数据也可能给UpdatedTime赋值,这样Normalize方法就不会执行了。






本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/4936961.html,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
Cloud Native NoSQL 关系型数据库
数据传输DTS校验问题之校验报错如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
开发框架 前端开发 网络协议
使用 DataAnnotations(数据注解)实现模型的通用数据校验
在实际项目开发中,无论任何方式、任何规模的开发模式,项目中都离不开对接入数据模型参数的合法性校验,目前普片的开发模式基本是前后端分离,当用户在前端页面中输入一些表单数据时,点击提交按钮,触发请求目标服务器的一系列后续操作,在这中间的执行过程中(标准做法推荐)无论...
43422 1
使用 DataAnnotations(数据注解)实现模型的通用数据校验
|
13天前
|
小程序
不要手动做数据校验
不要手动做数据校验
24 0
|
2月前
|
前端开发 JavaScript Java
如何使用JSR 303 进行后台数据校验?
这篇文章详细介绍了如何使用JSR 303进行后端数据校验,包括JSR 303的基本概念、使用原因、常见操作,以及如何通过注解进行数据校验、分组校验和自定义校验注解的方法和实际应用示例。
如何使用JSR 303 进行后台数据校验?
|
5月前
|
前端开发 API 数据安全/隐私保护
如何优雅的进行入参数据校验?
【4月更文挑战第11天】如何优雅的进行入参数据校验?
|
5月前
|
SQL API 数据库
优雅地进行入参数据校验:场景和处理方式
在日常的开发工作中,入参数据校验是确保程序健壮性的关键步骤之一,我们需要确保请求中的数据类型、格式和取值范围符合要求,以保证接口的安全性和稳定性,还有就是传递给方法或函数的数据需要满足一定的规则和要求,以保证程序的正常运行和数据的有效处理。那么本文就来分享一下在哪些场景下进行入参数据校验,并分享一些优雅的处理方式,以提高代码的可读性、扩展性和复用性。
87 3
优雅地进行入参数据校验:场景和处理方式
|
5月前
|
数据采集 监控 安全
中间件数据传输数据校验
中间件数据传输校验确保数据完整性、准确性和安全,涉及完整性、准确性和安全校验。常见校验方法包括奇偶校验、CRC、校验和、哈希函数和数字签名。实践中,数据在发送前和接收后均需校验,错误处理需及时,校验策略应可配置。安全上,加密保护敏感数据,防止重放攻击。监控和日志记录有助于追踪问题,提升系统可靠性。
56 1
|
12月前
|
Java 数据库连接 开发者
计量单位及数据校验解读
计量单位及数据校验解读
|
存储 SQL 容灾
推荐一款好用的数据一致性校验工具
NineData 是玖章算术旗下的多云数据管理平台,它是一款即开即用的数据管理 SAAS 服务。当前 NineData 已经支持数十种常见同异构数据源(MySQL、SQLServer、CK 等)之间的结构对比、数据对比及数据订正能力。NineData 结构及数据对比作为独立服务,可以灵活支持 IDC、云主机自建及云托管数据源的数据一致性校验及快速修复。从使用体验、产品能力、稳定性及性能等维度综合来看,NineData 是一款综合实例比较强、比较难得的校验工具。
2366 1
推荐一款好用的数据一致性校验工具
|
前端开发 Java API
数据校验(前端数据校验、JSR303校验)
数据校验(前端数据校验、JSR303校验)
222 0