如何解决IModelValidatorProvider 和 IModelValidator 实现的问题未正确处理生成的错误
我尝试在我的 ASP.NET Core 项目中使用 IModelValidatorProvider
和 IModelValidator
接口进行相应的模型验证。
不幸的是,它没有按预期工作。
即我的 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
(工作正常)
请在下面找到带有 ModelState.Values
内容的屏幕截图,以防使用模型验证器(它不能正常工作)
解决方法
您只需要在您的 MyCustomModelValidator
中更改您的代码,如下所示:
if (string.IsNullOrEmpty(model.Code) == true)
{
return new List<ModelValidationResult>
{
new ModelValidationResult("","Empty Code value is not accepted")
};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。