突然想起来自己的校验很多都是前端做的,完全忘了后端也能做校验,写个笔记记录一下,ABP里一般都是使用特性来做校验。
对了,前置笔记:
Angular使用指令来添加校验器_董厂长的博客-CSDN博客
Angular提交表单时,再次验证_董厂长的博客-CSDN博客
接下来进入正题。
在web应用中,验证通常 被实现两次:客户端和服务器端。客户端验证的实现主要用于用户体验。首先,最好是在客户端检验表单并且向 用户展示无效的字段。但是,相对于客户端验证,服务器端验证是更重要并且不可缺失的。 服务器端的验证通常是在应用层或者控制器中被实现(通常,所有的服务都是从持久层获取数据)。应用服务中的 方法首先应检测输入数据(有效性)然后使用这些数据。
但是有一说一,实际的开发中前端校验不通过不允许回传数据,那么后端校验也可以不要。: -(
Description 属性
ABP可以使用数据注解来检验数据的有效性。假设我们正在开发一个创建任务的应用服务,并且得到了一个输 入,如下所示:
public class CreateTaskInput
{
public int? AssignedPersonId { get; set; }
[Required]
public string Description { get; set; }
}
在这里 Description 属性被标记为 Required。AssignedPersonId 是可选的。在 System.ComponentModel.DataAnnotations 命名空间中,还有很多这样的特性 ( 例如: MaxLength, MinLength, RegularExpression 等等 )。
自定义检验
如果数据注解的方式不能满足你的需求,你可以实现ICustomValidate接口,请看下面示例:
public class CreateTaskInput : ICustomValidate
{
public int? AssignedPersonId { get; set; }
public bool SendEmailToAssignedPerson { get; set; }
[Required]
public string Description { get; set; }
public void AddValidationErrors(CustomValidatationContext context)
{
if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || Assigne
dPersonId.Value <= 0))
{
context.Results.Add(new ValidationResult("AssignedPersonId must be
set if SendEmailToAssignedPerson is true!"));
}
}
}
ICustomValidate 接口声明了一个可被实现的 AddValidationErrors 方法。如果有验证错误的话,我们必须添加 ValidationResult 对象到 context.Results 列表。如果需要的话,你也可以使用 context.IocResolver 来解决依 赖关系。
除了 ICustomValidate 接口,ABP也对.NET标准的 IValidatableObject 接口提供支持。你也可以实现它来执行 自定义验证。如果你实现了这两个接口,那么这两个接口的方法都会被调用。
官方完整文档: