相关疑难解决方法(0)

如何在 Web API 请求中的 FromBody ViewModel 中使用带有 EnumMember 属性的枚举?

我正在尝试使用视图模型和枚举在 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.DependencyInjectionMicrosoft.AspNetCore.Mvc.NewtonsoftJsonNewtonsoft.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)

c# asp.net-mvc asp.net-web-api asp.net-core .net-core-3.0

7
推荐指数
1
解决办法
1万
查看次数

无法在 asp.net core api 3.1 中将 [FromForm] 枚举与 [EnumMember] 映射

我有一个枚举,并为其值指定了 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)

c# json.net asp.net-core-webapi

2
推荐指数
1
解决办法
1192
查看次数