前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABP框架学习之——数据校验

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

作者头像
易兒善
发布2018-08-21 15:24:53
5230
发布2018-08-21 15:24:53
举报
文章被收录于专栏:挖坑填坑

校验介绍

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

基础验证

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

代码语言:javascript
复制
    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也可以直接使用如下:

代码语言:javascript
复制
    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接口类自定义验证:

代码语言:javascript
复制
    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方法就会在验证之后调用。

代码语言:javascript
复制
    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收到的数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.10.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 校验介绍
  • 基础验证
  • 自定义验证
  • 标准化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档