Asp.net web api ModelState检查Web Api中的所有参数
这是我的操作ModelState只检查bookId参数。另一个即使为null,也不会引发错误 有没有办法让它检查所有参数的ModelStateAsp.net web api ModelState检查Web Api中的所有参数,asp.net-web-api,Asp.net Web Api,这是我的操作ModelState只检查bookId参数。另一个即使为null,也不会引发错误 有没有办法让它检查所有参数的ModelState [HttpPut] [Route("{bookId}")] public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId) { if (!this.service.ExistsBook(bookId)) { return th
[HttpPut]
[Route("{bookId}")]
public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId)
{
if (!this.service.ExistsBook(bookId))
{
return this.NotFound();
}
if (!this.ModelState.IsValid)
{
return this.StatusCode(HttpStatusCode.BadRequest);
}
this.service.EditBook(bookId, model);
return this.Ok();
}
您可以定义一个
ActionFilterAttribute
,以保护您不受空参数的影响:
public class CheckModelForNullAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ActionArguments.ContainsValue(null))
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The argument cannot be null");
}
}
然后用这个:
[HttpPut]
[Route("{bookId}")]
[CheckModelForNull]
public IHttpActionResult Edit([FromBody] EditBookBindingModel model, int bookId)
{
// model can´t be null now
...
我编写了一个自定义过滤器,因此
DataAnnotations
也可以处理参数。
这是过滤器
公共类ModelValidationFilter:FilterAttribute、IActionFilter、IFilter
{
公共任务ExecuteActionFilterAsync(HttpActionContext actionContext,
CancellationToken CancellationToken,Func continuation)
{
var parameters=actionContext.ActionDescriptor.GetParameters();
if(parameters.Any())
{
var validationParams=parameters.Where(x=>x.GetCustomAttributes().Any());
if(validationParams.Any())
{
foreach(validationParams中的var项)
{
var val=actionContext.ActionArguments[item.ParameterName];
foreach(item.GetCustomAttributes()中的var attr)
{
如果(!attr.IsValid(val))
{
actionContext.ModelState.AddModelError(item.ParameterName,attr.FormatErrorMessage(item.ParameterName));
}
}
}
}
如果(!actionContext.ModelState.IsValid)
{
返回Task.FromResult(actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,actionContext.ModelState));
}
}
返回continuation();
}
}
用法(我还没有完全测试过):
将其添加到全局过滤器
config.Filters.Add(新的ModelValidationFilter());
public Student Post([必需]添加studentdto)
{
//你的逻辑
}
公共学生修补程序([FromBody,必选]addStudentDTO,[Required,EmailAddress]字符串EmailAddress])
{
//你的逻辑
}