如何在所有控制器上处理null模型aspnet核心c#

时间:2017-03-03 09:47:25

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

我的web api有很多模型设置,其中没有任何属性可以对付它们。这是一个简单的控制器示例

public async Task<IActionResult> PutAsync([FromBody] ChartModel model)
{
    ....
}

现在,如果用户尝试在模型中上传无效数据类型,例如,在数字属性中键入一个字母,那么我的控制器将收到空。

处理此问题的最佳,最简单的方法是什么?如果这些特定方法的模型为null,我想返回BadRequest。

我可以为每个方法添加类似下面的内容。

if (model == null)
    return new BadRequestObject("Invalid model");

但我相信必须有一些我可以做的事情,而且更干净整洁,我只是不知道是什么

2 个答案:

答案 0 :(得分:4)

你可以做这样的事情

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(
                HttpStatusCode.NotAcceptable, modelState);
        }
    }
}

然后在控制器方法上使用它

[ValidateModel]
public async Task<IActionResult> PutAsync([FromBody] ChartModel model)
{
     // your code goes here
} 

如果ModelState有效,您不必每次都在代码中检查。

答案 1 :(得分:1)

在途中是实现ActionFilter属性,在方法执行之前进行检查,如果发现任何无效参数,则返回错误响应。

例如这个(.NET 4.5代码!)如果找到任何内容将返回BadRequest!参数为null。

public class ParamCheck : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var args = actionContext.ActionArguments;
        if (args.Any(arg => arg.Value == null))
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Null params");
        else
            base.OnActionExecuting(actionContext);
    }
}

然后用ActionFilter装饰您的方法或全局注册。

    [HttpGet]
    [ParamCheck]
    public HttpResponseMessage Test(SummarySyncParams pars)
    {}