【发布时间】:2017-04-19 12:35:44
【问题描述】:
我正在使用 Web API 5 构建 Web 服务。我正在通过扩展 IModelBinder 接口以将复杂类型作为参数映射到操作来实现自定义模型绑定器。绑定部分工作正常。但是模型验证不会发生。 ModelState.IsValid 始终为真。
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 answer 可能重复。
-
@MihailStancescu 我看到了这个问题。它适用于 DataAnnotations。但如果我使用 FluentValidation 或类似的,它就行不通了。所以这里似乎缺少一些东西。
标签: c# asp.net asp.net-web-api asp.net-web-api2