繁体   English   中英

如何在所有控制器ASPNET Core C#上处理空模型

[英]How to handle null Model on all controllers aspnet core c#

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

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

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

最好的,最简单的方法是什么? 如果这些特定方法的模型为null,我想返回BadRequest。

我可以在每种方法中添加以下内容。

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

但我敢肯定,我必须做些更清洁,更整洁的事情,我只是不知道

你可以做这样的事情

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

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

例如,此(.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)
    {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM