C# 如何为外部库中定义的模型编写ASP.NET自定义验证程序
我正在尝试为正在开发的ASP.NET核心web应用程序编写自定义验证类。我已经找到了各种编写自定义客户端验证的示例,例如和。这些都很清楚,对我来说很有意义。然而,我的问题是,我的模型是在其他项目共享的.NET标准库中定义的。我无法访问在此库中创建自定义验证类所需的基类 基本上,我需要确保C# 如何为外部库中定义的模型编写ASP.NET自定义验证程序,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我正在尝试为正在开发的ASP.NET核心web应用程序编写自定义验证类。我已经找到了各种编写自定义客户端验证的示例,例如和。这些都很清楚,对我来说很有意义。然而,我的问题是,我的模型是在其他项目共享的.NET标准库中定义的。我无法访问在此库中创建自定义验证类所需的基类 基本上,我需要确保model.PropertyA永远不会大于model.PropertyB。我知道我可以编写一些JavaScript来实现这一点,但如果可能的话,我更愿意利用现有的ASP.NET核心验证技术 如果可能的话,我宁愿避
model.PropertyA
永远不会大于model.PropertyB
。我知道我可以编写一些JavaScript来实现这一点,但如果可能的话,我更愿意利用现有的ASP.NET核心验证技术
如果可能的话,我宁愿避免任何第三方依赖来实现这一点。hy,
最好避免对数据注释进行验证,因为您并非在所有情况下都可以访问它们,就像您描述的情况一样;
存在一个强大的包“FluentValidation”
您可以创建模型类并根据属性进行验证
样本:
完整文档:
然后为命令添加验证程序,如以下示例所示:
public class CreatePersonCommandValidator :
AbstractValidator<CreatePersonCommand>
{
....
public CreateTodoListCommandValidator(IApplicationDbContext context)
{
_context = context;
RuleFor(v => v.Name)
.NotEmpty().WithMessage("Name is required.")
.MaximumLength(200).WithMessage("Name must not exceed 200 characters.");
}...
....
..
公共类CreatePersonCommandValidator:
抽象验证器
{
....
公共CreateTodoListCommandValidator(IApplicationDbContext上下文)
{
_上下文=上下文;
规则(v=>v.Name)
.NotEmpty().WithMessage(“需要名称”)
.最大长度(200)。WithMessage(“名称不得超过200个字符”);
}...
....
..
您可以构建一个类,从库中扩展该类。并扩展IValidatableObject
以实现验证
public class MyClass : Base, IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (PropertyA > PropertyB)
{
yield return new ValidationResult(
$"model.PropertyA {PropertyA} can't greater than model.PropertyB ." );
}
}
}
Base
课程来自图书馆
public class Base
{
public int PropertyA { get; set; }
public int PropertyB { get; set; }
}
MyClass是为验证而构建的
public class MyClass : Base, IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (PropertyA > PropertyB)
{
yield return new ValidationResult(
$"model.PropertyA {PropertyA} can't greater than model.PropertyB ." );
}
}
}
测试结果:
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
谢谢你的回答。不幸的是,作为一般规则,我尽量避免使用第三方依赖关系。我认为最好的解决方案可能是使用JavaScript手动执行,除非有其他解决方案可用。不管怎样,我都会投票支持你的答案。因此,如果我还想验证其他属性,但是我不需要对它们进行自定义验证?因为验证存在于新的MyClass中,使用上面的示例,我如何添加一个简单的[Required]属性到一个不太复杂的属性,我只关心它是否为空?你是指
Base
实体中的其他属性吗?对不起,我理解不清楚,我对上面的描述感到困惑。我建议你可以更新问题或发布新的线程来讨论它。我为沟通错误道歉。我看到你的我将向Validate()方法添加更多的逻辑来说明这一点。
<div asp-validation-summary="ModelOnly" class="text-danger"></div>