IModelValidatorProvider 和 IModelValidator 实现的问题。生成的错误没有得到正确处理

Issue with IModelValidatorProvider and IModelValidator implementations. The generated error is not treated correctly

我尝试在我的 ASP.NET 核心项目中使用 IModelValidatorProviderIModelValidator 接口来进行各自的模型验证。

不幸的是,它没有按预期工作。 即我的 ModelValidator class (implements IModelValidator) returns 只有一个错误。结果,我看到 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 使用(工作正常)

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

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

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

测试结果: