IModelValidatorProvider 和 IModelValidator 实现的问题。生成的错误没有得到正确处理
Issue with IModelValidatorProvider and IModelValidator implementations. The generated error is not treated correctly
我尝试在我的 ASP.NET 核心项目中使用 IModelValidatorProvider
和 IModelValidator
接口来进行各自的模型验证。
不幸的是,它没有按预期工作。
即我的 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")
};
}
测试结果:
我尝试在我的 ASP.NET 核心项目中使用 IModelValidatorProvider
和 IModelValidator
接口来进行各自的模型验证。
不幸的是,它没有按预期工作。
即我的 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")
};
}
测试结果: