ABP框架学习之——数据校验

校验介绍

一个应用的输入应该首先要验证。这个输入可以是用户的输入,也可以是另一个应用的输入。在一个Web应用中,验证通常要实现2次:第一次是客户端验证,第二次是服务端验证。客户端的验证是为了更好的用户体验,通过检测表单的字段来提醒用户必须的字段;服务端的验证是更严格且无法避免的。
服务端的验证是在应用服务层实现的。应用服务方法应该首先检查(验证)输入然后在使用。ABP提供了一个不错的基础设施来验证应用服务方法的输入。

基础验证

查看模板创建的dto中可以看见如下的内容,其中Required和StringLength都继承于ValidationAttribute类,如果我们需要自定义这样公用的验证方式,也可以自己继承这个类,并引用。

    public class RoleDto : EntityDto<int>
    {
        [Required]
        [StringLength(AbpRoleBase.MaxNameLength)]
        public string Name { get; set; }
        
        [Required]
        [StringLength(AbpRoleBase.MaxDisplayNameLength)]
        public string DisplayName { get; set; }

        public string NormalizedName { get; set; }
        
        [StringLength(Role.MaxDescriptionLength)]
        public string Description { get; set; }

        public bool IsStatic { get; set; }

        public List<string> Permissions { get; set; }
    }

我们自己定义的dto也可以直接使用如下:

    public class UpdateNoteDto : EntityDto<int>
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 内容
        /// </summary>
        [Required]
        public string Content { get; set; }
        /// <summary>
        /// 上次修改时间
        /// </summary>
        public DateTime? LastModificationTime { get; set; }
    }

测试一下,在Swagger UI 中:

api发送的内容
收到的回复

自定义验证

对于特殊的逻辑,我们只在这个功能中验证数据,别的地方用不到,我们也可以实现ICustomValidate接口类自定义验证:

    public class PublicNoteDto: UpdateNoteDto,ICustomValidate
    {
        /// <summary>
        /// 简单描述,用于微信推送时的描述或者其他
        /// </summary>
        public string Des { get; set; }
        /// <summary>
        /// 封面图片,可用于微信推送时或者其他
        /// </summary>
        [Required]
        public string Img { get; set; }
        /// <summary>
        /// 关键字,可用于搜索,分类等
        /// </summary>
        public string Tags { get; set; }
        /// <summary>
        /// 是否发布
        /// </summary>
        public bool IsPublic { get; set; }

        public void AddValidationErrors(CustomValidationContext context)
        {
            if (string.IsNullOrEmpty(Des))
            {
                string error = "描述不能为空!";
                context.Results.Add(new ValidationResult(error));
            }
            if (Des.Length < 10)
            {
                string error = "描述不能少于10个字!";
                context.Results.Add(new ValidationResult(error));
            }
            if (Des.Length > 200)
            {
                string error = "描述不能大于200个字!";
                context.Results.Add(new ValidationResult(error));
            }
        }
    }
api发送的内容
收到的回复

标准化

标准化就是在验证之后,进行一些额外的操作。
具有Normalize方法的IShouldNormalize接口。如果实现了这个接口,Normalize方法就会在验证之后调用。

    public class CreateNoteDto : IShouldNormalize
    {
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime? CreationTime { get; set; }
        /// <summary>
        /// 创建人
        /// </summary>
        public long CreatorUserId { get; set; }
        /// <summary>
        /// 内容的数据类型 markdown内容,html内容,或者其他
        /// </summary>
        public int TextType { get; set; }

        public void Normalize()
        {
            CreationTime = DateTime.Now;
        }
    }

api发送的内容
我们service收到的数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,506评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,777评论 25 709
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 12,306评论 6 13
  • 孩子们喜欢在黑板上各种画,可是教室太小不能好多个孩子一起怎么办呢?终于想出了一招,把多元智能理论课上的题拿了出来[...
    LOLA美育探索阅读 309评论 0 0
  • 听说她还是喜欢旅游,听说她开始计划停留。听说她想去的地方很冷,听说她还是一个人。 1 胖子喜欢小仙女很多年。套用胖...
    木十八阅读 838评论 5 5

友情链接更多精彩内容