Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为外部库中定义的模型编写ASP.NET自定义验证程序_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 如何为外部库中定义的模型编写ASP.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核心验证技术 如果可能的话,我宁愿避

我正在尝试为正在开发的ASP.NET核心web应用程序编写自定义验证类。我已经找到了各种编写自定义客户端验证的示例,例如和。这些都很清楚,对我来说很有意义。然而,我的问题是,我的模型是在其他项目共享的.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>