是否可以在ASP.NET Core中使用自定义ModelState验证提供程序?

时间:2016-05-02 12:23:17

标签: 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验证提供程序集成?

1 个答案:

答案 0 :(得分:6)

首先,您需要实施自定义IModelValidatorProviderIModelValidator

请考虑我写过的这个简单例子。

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

            context.Validators.Add((IModelValidator)validator);
        }
    }
}


public interface ISelfValidatableModel
{
    string Validate();
}

public class MyCustomModelValidator<T> : IModelValidator where T : ISelfValidatableModel
{
    public bool IsRequired
    {
        get { return false; }
    }

    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

相关问题