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