ASP .NET Web API中不区分大小写的枚举

时间:2019-04-15 09:38:00

标签: c# asp.net-web-api enums asp.net-4.5

在我的Web API中,我对包含enum属性的对象进行CRUD操作的端点。

// User.cs
public class User
{
    public string Username { get; set; }
    public Platform Platform { get; set; }
}

public enum Platform
{
    Windows, Linux, MacOS
}

// UserController.cs
public class UserController : ApiController 
{
    public IHttpActionResult Post(User value)
    {
        users.Add(value);
        return Ok();
    }
    //...
}

使用以下有效负载调用端点时,它可以正常工作:

{"Username": "jason", "Platform": "Linux"}

ASP .NET将枚举值正确解析为Platform.Linux 但是,如果大小写不同,例如:

{"Username": "jason", "Platform": "linux"}

然后,ASP .NET不会将其识别为Platform.Linux,而是默默使用默认值Platform.Windows

API从无法更改的其他服务获取请求,因此必须同时支持两种大小写形式。

我知道我可以只使用两个等效的枚举值,而不同的大小写是这样的:

public enum Platform
{
    Windows=0, windows=0,
    Linux=1, linux=1,
    MacOS=2, macos=2
}

但是我想知道是否有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

事实证明,在我的情况下,有一个自定义转换器用于该对象,然后再传递给控制器​​。该转换器使用Enum.TryParse来解析值:

if (Enum.TryParse(enumLiteral, out result))
{
    return result;
}

我将其更改为

if (Enum.TryParse(enumLiteral, true, out result))
{
    return result;
}

这使解析不区分大小写。

请注意,这是一个自定义转换器,不属于ASP.NET本身。当我完全删除该转换器并仅使用本机功能时,不会发生此问题。