2016-05-02 12 views
4

私は、次のASP.NETコアアクションがあります。ASP.NET CoreでカスタムModelState検証プロバイダを使用できますか?

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検証プロバイダとそれを統合する方法自分の行動でバリデータを定義しますか?

答えて

5

カスタムIModelValidatorProviderIModelValidator

を実装する必要がまず第一に、私が書いてきたこの単純な例を考えてみてください。なぜISelfValidatableModelを持つ

DataAnnotationsModelValidatorProvider.cs

DataAnnotationsModelValidator.cs

+0

:あなたはMVCのオプションの中に内蔵された例

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

Frameworkのカスタムプロバイダーを追加する必要が

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>(); } } 

?私が奇妙に感じるもの:IModelValidatorが非同期をサポートしていないので、バリデータが非同期にIModelValidatorにそのメソッドを含める方法を検証するとしたら? IModelValidatorにValidateAsyncメソッドがないというのは奇妙なことではありませんか? –

+0

この例では、ISelfValidatableModelを楽しいものにするだけです。現在、このAPIは非同期ではありません。 –

+0

Model Validation Ayncを行う予定があるかどうか知っていますか? –

関連する問題