Asp.net web api ModelState检查Web Api中的所有参数

Asp.net web api ModelState检查Web Api中的所有参数,asp.net-web-api,Asp.net Web Api,这是我的操作ModelState只检查bookId参数。另一个即使为null,也不会引发错误 有没有办法让它检查所有参数的ModelState [HttpPut] [Route("{bookId}")] public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId) { if (!this.service.ExistsBook(bookId)) { return th

这是我的操作ModelState只检查bookId参数。另一个即使为null,也不会引发错误

有没有办法让它检查所有参数的ModelState

[HttpPut]
[Route("{bookId}")]
public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId)
{
    if (!this.service.ExistsBook(bookId))
    {
        return this.NotFound();
    }

    if (!this.ModelState.IsValid)
    {
        return this.StatusCode(HttpStatusCode.BadRequest);
    }

    this.service.EditBook(bookId, model);

    return this.Ok();
}

您可以定义一个
ActionFilterAttribute
,以保护您不受空参数的影响:

public class CheckModelForNullAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ActionArguments.ContainsValue(null))
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The argument cannot be null");
    }
}
然后用这个:

[HttpPut]
[Route("{bookId}")]
[CheckModelForNull]
public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId)
{
    // model can´t be null now
    ...

我编写了一个自定义过滤器,因此
DataAnnotations
也可以处理参数。 这是过滤器

公共类ModelValidationFilter:FilterAttribute、IActionFilter、IFilter { 公共任务ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken CancellationToken,Func continuation) { var parameters=actionContext.ActionDescriptor.GetParameters(); if(parameters.Any()) { var validationParams=parameters.Where(x=>x.GetCustomAttributes().Any()); if(validationParams.Any()) { foreach(validationParams中的var项) { var val=actionContext.ActionArguments[item.ParameterName]; foreach(item.GetCustomAttributes()中的var attr) { 如果(!attr.IsValid(val)) { actionContext.ModelState.AddModelError(item.ParameterName,attr.FormatErrorMessage(item.ParameterName)); } } } } 如果(!actionContext.ModelState.IsValid) { 返回Task.FromResult(actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,actionContext.ModelState)); } } 返回continuation(); } } 用法(我还没有完全测试过):

将其添加到全局过滤器

config.Filters.Add(新的ModelValidationFilter());
public Student Post([必需]添加studentdto)
{
//你的逻辑
}
公共学生修补程序([FromBody,必选]addStudentDTO,[Required,EmailAddress]字符串EmailAddress])
{
//你的逻辑
}