美文网首页ABP框架学习
ABP框架学习之——数据校验

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

作者: 易兒善 | 来源:发表于2017-10-23 14:49 被阅读141次

    校验介绍

    一个应用的输入应该首先要验证。这个输入可以是用户的输入,也可以是另一个应用的输入。在一个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收到的数据

    相关文章

      网友评论

        本文标题:ABP框架学习之——数据校验

        本文链接:https://www.haomeiwen.com/subject/ogiouxtx.html