簡體   English   中英

是否可以在 ASP.NET Core 中使用自定義 ModelState 驗證提供程序?

[英]Is it possible to use a custom ModelState validation provider in ASP.NET Core?

我有以下 ASP.NET CORE 操作:

public async Task<IActionResult> Post([FromBody]Model model) { 

   IValidator<Model> validator = new Validator<Model>();

   Boolean valid = await validator.ValidateAsync(model); 

   if (!valid)
      return HttpBadRequest(validator.GetErrors());

   // Do something
}

我如何將它與 IOC 和自定義 ModelState 驗證提供程序集成,而不是在我的操作中定義驗證器?

首先,您需要實現您的自定義IModelValidatorProviderIModelValidator

請考慮我寫的這個簡單的例子:

public class MyCustomModelValidatorProvider : IModelValidatorProvider
{
    public void CreateValidators(ModelValidatorProviderContext context)
    {
        if (context.ModelMetadata.MetadataKind == ModelMetadataKind.Type)
        {
            var validatorType = typeof(MyCustomModelValidator<>)
                .MakeGenericType(context.ModelMetadata.ModelType);
            var validator = (IModelValidator)Activator.CreateInstance(validatorType);

            context.Results.Add(new ValidatorItem
                                {
                                    Validator = validator,
                                    IsReusable = true
                                });
        }
    }
}

public interface ISelfValidatableModel
{
    string Validate();
}

public class MyCustomModelValidator<T> : IModelValidator where T : ISelfValidatableModel
{
    public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
    {
        var model = (T)context.Model;

        var error = model.Validate();

        if (!string.IsNullOrEmpty(error))
        {
            return new List<ModelValidationResult>
            {
                new ModelValidationResult(model.ToString(), error)
            };
        }

        return Enumerable.Empty<ModelValidationResult>();
    }
}

您需要將自定義提供程序添加到 MVC 選項中:

services.AddMvc(options =>
{
    options.ModelValidatorProviders.Add(new MyCustomModelValidatorProvider());
});

框架內置示例:

DataAnnotationsModelValidatorProvider.cs
DataAnnotationsModelValidator.cs

暫無
暫無

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

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