我正在使用Web API 5構建Web Service。我通過擴展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.
}
}
如果我顯式調用Validate()或使用[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