我有一个控制器
[HttpGet]
[RoutePrefix("api/products/{productId}")]
public HttpResponseMessage Products(int productId,TypeEnum ptype=TypeEnum.Clothes)
{
if(!Enum.IsDefined(typeOf(TypeEnum),ptype))
//throw bad request exception
else
//continue processing
}
Myenum 被声明为
public TypeEnum
{
Clothes,
Toys,
Electronics
}
目前,如果传递了一些垃圾值,它将被转换为默认值。
我想要做的是,如果我将控制器称为 api/products/1,那么应该为 ptype 分配默认值,即衣服。如果我将控制器调用为 api/products/1?pType=somegarbagevalue 那么控制器应该抛出错误的请求异常。我怎样才能实现这个目标?
将所有枚举参数定义为字符串,然后在各处解析它们意味着您必须在每一个动作并且您需要提出一致的方法,以使所有解析错误都一致。
这是一个参数绑定问题,不应该在控制器层处理,应该在管道中处理。一种方法是创建自定义过滤器并将其添加到您的配置中。
public class ModelStateValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
actionContext.Response = <your standardised error response>
}
}
}
在你的 global.asax.cs 中
...
GlobalConfiguration.Configure(WebApiConfig.Register);
...
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
config.Filters.Add(new ModelStateValidationAttribute());
...
}
}
如果您在模型状态方面遇到问题,它的类型是 ModelStateDictionary,您只需迭代它,然后它的 Errors 属性包含所有模型绑定问题。例如
modelState = actionContext.ModelState;
modelState.ForEach(x =>
{
var state = x.Value;
if (state.Errors.Any())
{
foreach (var error in state.Errors)
{
<work your magic>
}
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)