ASP.NET Web Api>发生验证错误时停止操作

时间:2019-01-03 18:03:39

标签: c# asp.net validation asp.net-web-api

我正在研究Web API项目。我使用System.Web.Http.ApiController作为控制器的基础

using System.Net;
using System.Web.Http;
using project.Models;

namespace project.Controllers
{
    public class DemoController : ApiController
    {
        [HttpPost]
        [Route("api/demo/submit")]
        public  object Post([FromBody] FormDataModel test)
        {
            ...
        }
    }
}

我的模特是

using System;
using System.ComponentModel.DataAnnotations;

namespace server.Models
{
    public class FormDataModel
    {
        [Required(ErrorMessage = "Phone is required")]
        [Phone(ErrorMessage = "Invalid Phone")]
        public string phone { get; set; }
    }
}

当我发送无效的POST请求时-Post操作仍将执行。我可以使用ModelState.IsValid来跟踪无效的请求,但这似乎是一个多余的步骤,因为如果验证失败,我将一直希望我的操作以相同的响应形式停止执行。

是否存在用于在单个位置管理整个控制器/应用程序验证失败的标准方法?

谢谢!

2 个答案:

答案 0 :(得分:0)

我相信您可以使用ActionFilters来做到这一点。查看这篇出色的文章:

https://smellyc0de.wordpress.com/2017/08/23/web-api-2-centralised-model-state-validation/

答案 1 :(得分:0)

这是一个ActionFilter,我可以用来做您要问的事情

public class ModelStateValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,
                actionContext.ModelState);
        }
    }
}

然后将其注册为全局处理程序

public static class FilterConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new ModelStateValidationAttribute());
    }
}