Web APIを使用してWebサービスを構築しています。5. IModelBinderインターフェイスを拡張して複雑な型をパラメータとしてマップし、カスタムモデルバインダーを実装しています。バインディング部分は正常に動作しています。しかし、モデル検証は行われません。 ModelState.IsValidは常にtrueです。カスタムモデルバインダーでWeb API検証がトリガーされない
public class PagingParamsVM
{
[Range(1, Int32.MaxValue, ErrorMessage = "Page must be at least 1")]
public int? Page { get; set; }
[Range(1, Int32.MaxValue, ErrorMessage = "Page size must be at least 1")]
public int? PageSize { get; set; }
}
public class PaginationModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var model = (PagingParamsVM)bindingContext.Model ?? new PagingParamsVM();
//model population logic
.....
bindingContext.Model = model;
return true;
}
}
public IEnumerable<NewsItemVM> Get([ModelBinder(typeof(PaginationModelBinder))]PagingParamsVM pegination)
{
//Validate(pegination); //if I call this explicitly ModelState.IsValid is set correctly.
var valid = ModelState.IsValid; //this is always true
}
public class ModelStateValidationActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var valid = actionContext.ModelState.IsValid //this is always true.
}
}
私は明示的に()検証を呼び出すか、[FromUri]属性を使用する場合、ModelState.IsValidが正しく設定されています。
public IEnumerable<NewsItemVM> Get([FromUri]PagingParamsVM pegination)
{
var valid = ModelState.IsValid;
}
モデルバインダー内に検証部品を実装する必要があります。もしそうなら、私はどのように実装すべきですか?
[SO回答](http://stackoverflow.com/questions/8668869/custom-model-binder-not-validating-model)の可能な複製。 –
@MihailStancescu私はこの質問を見ました。それはDataAnnotationsでうまく動作します。 FluentValidationなどを使用すると動作しません。だから、ここに何かが欠けているようだ。 – sajith