我有以下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验证提供程序集成?
答案 0 :(得分:6)
首先,您需要实施自定义IModelValidatorProvider和IModelValidator
请考虑我写过的这个简单例子。
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());
});
框架内置示例: