gpt4 book ai didi

c# - 具有默认值的 Asp.net webapi 枚举参数

转载 作者:可可西里 更新时间:2023-11-01 08:37:40 35 4
gpt4 key购买 nike

我有一个 Controller

   [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
}

目前,如果传递了一些垃圾值,它将被转换为默认值。 我想要做的是,如果我将 Controller 称为 api/products/1,那么应该为 ptype 分配默认值,即衣服。如果我将 Controller 称为 api/products/1?pType=somegarbagevalue 那么 Controller 应该抛出错误的请求异常。我怎样才能做到这一点?

最佳答案

将所有枚举参数定义为字符串,然后在任何地方解析它们意味着您必须对每个 Action 执行此操作,并且您需要想出一种一致的方法,以便所有解析错误都符合。

这是一个参数绑定(bind)问题,不应该在controller层处理,应该在pipeline中处理。一种方法是创建一个自定义过滤器并将其添加到您的配置中。

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 属性就会包含所有模型绑定(bind)问题。例如

modelState = actionContext.ModelState;
modelState.ForEach(x =>
{
var state = x.Value;
if (state.Errors.Any())
{
foreach (var error in state.Errors)
{
<work your magic>
}
}
});

关于c# - 具有默认值的 Asp.net webapi 枚举参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720357/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com