IModelValidatorProvider 和 IModelValidator 实现的问题未正确处理生成的错误

问题描述

我尝试在我的 ASP.NET Core 项目中使用 IModelValidatorProviderIModelValidator 接口进行相应的模型验证。

不幸的是,它没有按预期工作。 即我的 ModelValidator 类(实现 IModelValidator)只返回一个错误。结果,我看到 ModelState 包含一个带有预期文本的错误。没事。 ModelState.ErrorsCount = 1。 但问题是新元素出现在 ModelState.Values 中。 它有一个键 Code.Code 而不是 Code,其中 Code 是模型属性之一的名称。这就是页面视图中 Code 属性的验证字段中未显示所需文本的原因。 如果我在控制器中使用 ModelState.AddModelError 方法,情况就不同了。

ModelState.AddModelError("Code","something went wrong...");

ModelState.Values 不包含键为 Code.Code 的附加元素。它包含键为 Code (ValidationState=Invalid) 的元素,并正确显示错误消息。

我想我在模型验证器上做错了。但我被卡住了,找不到确切的问题。感谢您提供任何建议。

请在下面找到我的验证器的源代码

public class CustomModelValidatorProvider : IModelValidatorProvider
{

    public CustomModelValidatorProvider()
    {
    }

    public void CreateValidators(ModelValidatorProviderContext context)
    {
        if (context.Results.Any(v => v.Validator.GetType() == typeof(MyCustomModelValidator)) == true)
        {
            return;
        }

        if (context.ModelMetadata.ContainerType == typeof(DealRegistrationViewModel))
        {
            context.Results.Add(new ValidatorItem
            {
                Validator = new MyCustomModelValidator(),IsReusable = true
            });
        }
    }
}

public class MyCustomModelValidator : IModelValidator
{
    public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
    {
        var model = context.Container as DealRegistrationViewModel;

        if (context.ModelMetadata.ModelType == typeof(string) 
                && context.ModelMetadata.Name == nameof(model.Code))
        {
            if (string.IsNullOrEmpty(model.Code) == true)
            {
                return new List<ModelValidationResult>
                {
                    new ModelValidationResult(context.ModelMetadata.PropertyName,"Empty Code value is not accepted")
                };
            }
        }

        return Enumerable.Empty<ModelValidationResult>();
    }
}

验证器在startup.cs中是这样激活的

services.AddMvc(options =>
{
    options.ModelValidatorProviders.Add(new CustomModelValidatorProvider());
});

请在下面找到包含 ModelState.Values 内容的屏幕截图,以防使用 ModelState.AddModelError(工作正常)

enter image description here

请在下面找到带有 ModelState.Values 内容的屏幕截图,以防使用模型验证器(它不能正常工作)

enter image description here

解决方法

您只需要在您的 MyCustomModelValidator 中更改您的代码,如下所示:

if (string.IsNullOrEmpty(model.Code) == true)
            {
                return new List<ModelValidationResult>
                {
                   new ModelValidationResult("","Empty Code value is not accepted")
                };
                   
            }

测试结果: enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...