我的web api有很多模型设置,其中没有任何属性可以对付它们。这是一个简单的控制器示例
public async Task<IActionResult> PutAsync([FromBody] ChartModel model)
{
....
}
现在,如果用户尝试在模型中上传无效数据类型,例如,在数字属性中键入一个字母,那么我的控制器将收到空。
处理此问题的最佳,最简单的方法是什么?如果这些特定方法的模型为null,我想返回BadRequest。
我可以为每个方法添加类似下面的内容。
if (model == null)
return new BadRequestObject("Invalid model");
但我相信必须有一些我可以做的事情,而且更干净整洁,我只是不知道是什么
答案 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)
{}