[英]Issue with IModelValidatorProvider and IModelValidator implementations. The generated error is not treated correctly
我嘗試在我的 ASP.NET 核心項目中使用IModelValidatorProvider
和IModelValidator
接口進行相應的 model 驗證。
不幸的是,它沒有按預期工作。 即我的ModelValidator
class (實現IModelValidator
)只返回一個錯誤。 結果,我看到ModelState
包含一個帶有預期文本的錯誤。 沒事。 ModelState.ErrorsCount = 1
。 但問題是ModelState.Values
中出現了新元素。 它有一個鍵Code.Code
而不是Code
,其中Code
是 model 屬性之一的名稱。 這就是頁面視圖中Code
屬性的驗證字段中未顯示所需文本的原因。 如果我在 controller 中使用ModelState.AddModelError
方法,情況就不同了。
ModelState.AddModelError("Code", "something went wrong...");
ModelState.Values
不包含帶有鍵Code.Code
的附加元素。 它包含帶有鍵Code
( ValidationState=Invalid
) 的元素,並正確顯示錯誤消息。
我想我在使用 model 驗證器時做錯了。 但我被卡住了,找不到確切的問題。 將不勝感激任何建議。
請在下面找到我的驗證器的源代碼
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
使用(工作正常)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.