【发布时间】:2022-01-19 17:14:06
【问题描述】:
有没有办法跨多个 DTO 集中对同一属性名称的模型验证?
例如,如果我将以下类用作 Web API 操作中的请求正文。
public class RegisterRequest
{
[Required]
[EmailAddress]
public string EmailAddress { get; set; } = null!;
[Required]
[MinLength(8)]
[RegularExpression(UserSettings.PasswordRegex)]
public string Password { get; set; } = null!;
[Required]
[MaxLength(100)]
public string DisplayName { get; set; } = null!;
}
public class UserProfileRequest
{
[Required]
public int UserId { get; set; }
[Required]
[MaxLength(100)]
public string DisplayName { get; set; } = null!;
[Range(3, 3)]
public string? CCN3 { get; set; }
}
我可以在DisplayName 上集中属性验证吗,复制属性违反单一责任原则。我相信我可以使用IFilterFactory 实现集中验证并放弃使用属性。
【问题讨论】:
-
我认为属性验证是针对每个对象完成的,如果你让所有其他类继承自 DisplayName 类(使用字符串 displayname 作为属性),那么你可以使用一个验证。如果对象相同,那么您可能正在复制您的代码
-
属性仅适用于特定类型或属性。如果您想集中验证,您必须使用例如 FluendValidation 以编程方式指定它。无论如何这是一个好主意 - 属性是静态的,而同一类在不同阶段可能有不同的要求。例如,在创建和编辑客户对象时应用不同的规则。
标签: asp.net-core asp.net-web-api asp.net-core-webapi