【问题标题】:How to handle null Model on all controllers aspnet core c#如何在所有控制器上处理空模型 aspnet core c#
【发布时间】:2017-03-03 09:47:25
【问题描述】:

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

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

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

最好、最简单的处理方法是什么?如果这些特定方法的模型为空,我想返回一个 BadRequest。

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

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

但我确信一定有一些我可以做的并且更干净整洁的东西,我只是不知道是什么

【问题讨论】:

  • ModelState.IsValid 告诉您是否已将任何模型错误添加到 ModelState 阅读有关 ModelState 的更多信息
  • 即使您没有在模型上设置任何属性?
  • 如果不出意外,全局操作过滤器可以做到这一点:)

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


【解决方案1】:

你可以这样做

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 是否有效。

【讨论】:

    【解决方案2】:

    方法是实现一个ActionFilter Attribute,在方法执行之前做检查,如果发现任何无效参数返回错误响应。

    例如,这个(.NET 4.5 代码!)如果找到 ANY,将返回 BadRequest!参数为空。

    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)
        {}
    

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2022-11-10
      • 1970-01-01
      • 2017-12-26
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多