簡體   English   中英

IModelValidatorProvider 和 IModelValidator 實現的問題。 生成的錯誤沒有得到正確處理

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

我嘗試在我的 ASP.NET 核心項目中使用IModelValidatorProviderIModelValidator接口進行相應的 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使用(工作正常)

在此處輸入圖像描述

請在下面找到帶有ModelState.Values內容的屏幕截圖,以防 Model 驗證器使用(它不能正常工作) 在此處輸入圖像描述

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

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

測試結果: 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM