我正在尝试使用视图模型和枚举在 ASP.NET Core Web API 项目中实现 HttpPost 方法[FromBody]。过去,将视图模型与[FromBody]属性绑定效果很好。
在我的特定场景中,我想提供一个 JSON 端点,在其中将给定值转换为具有不同名称的 C# 枚举。这个例子应该解释我想要实现的目标:
公共枚举 WeatherEnum
{
[EnumMember(值 = "好")]
好的,
[EnumMember(值 = "坏")]
坏的
}
在内部,我想使用WeatherEnum.Goodand WeatherEnum.Bad,并且我的端点的使用者希望使用小写值。因此,我尝试将 JSON 正文中传递的值映射到我的 Enum 表示形式。
我读过有关EnumMember属性 和 的内容StringEnumConverter。我已经从新的 ASP.NET Core Web API 3.0 模板创建了一个最小示例(您需要添加这些 NuGet 包Microsoft.Extensions.DependencyInjection、Microsoft.AspNetCore.Mvc.NewtonsoftJson和Newtonsoft.Json)
配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddNewtonsoftJson(json =>
{
json.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});
services.AddControllers(); …Run Code Online (Sandbox Code Playgroud) 我有一个枚举,并为其值指定了 EnumMemberAttribute:
public enum HireStrategy
{
[EnumMember(Value = "30-days")]
Days30,
[EnumMember(Value = "60-days")]
Days60,
[EnumMember(Value = "90-days")]
Days90
}
Run Code Online (Sandbox Code Playgroud)
我希望能够使用值30-days, 60-days,90-days作为我的 api 的输入参数。这是服务配置:
services
.AddControllers()
.AddNewtonsoftJson(config =>
{
config.SerializerSettings.Converters.Add(new StringEnumConverter(typeof(CamelCaseNamingStrategy)));
});
services
.AddMvc();
Run Code Online (Sandbox Code Playgroud)
还有我的行动:
[HttpPost("test")]
public async Task<IActionResult> Test(HireStrategy type)
{
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用该请求(通过邮递员)时,
https://localhost:44329/api/v1/users/test?type=60-days
我收到验证错误,即它甚至没有执行我的操作:
public enum HireStrategy
{
[EnumMember(Value = "30-days")]
Days30,
[EnumMember(Value = "60-days")]
Days60,
[EnumMember(Value = "90-days")]
Days90
}
Run Code Online (Sandbox Code Playgroud)
当我传递“days60”作为值时,它工作正常。我有什么遗漏的吗?谢谢!
更新#1:我尝试禁用 ApiController 验证以查看 newtonsoft 是否处理请求:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter …Run Code Online (Sandbox Code Playgroud)