包含枚举描述的发布请求



我正在.net核心中制作一个简单的API,并试图实现一个帖子,我需要在其中处理枚举值。

我为此使用了"SaveProfileResource",这是我的控制器类中的AutoMapper使用的。

我特别想要的是用这样的身体发出 POST 请求:

{
"FirstName": "Karl",
"LastName": "Marx",
"UserName": "MarxDidNothingWrong69",
"Gender": "Diverse"
}

其中性别是一个枚举。

代码如下所示:

public class SaveProfileResource
{
[Required]
[MaxLength(60)]
public string FirstName { get; set; }
[Required]
[MaxLength(60)]
public string LastName {get; set;}
[Required]
[MaxLength(60)]
public string UserName {get; set;}
[Required]
public EGender Gender {get; set;}
}

其中EGender看起来像这样:

public enum EGender
{
[Description("Male")]
Male = 1,
[Description("Female")]
Female = 2,
[Description("Diverse")]
Diverse = 3,
}

以及我的控制器类中的 post 方法:

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody] SaveProfileResource resource){
if(!ModelState.IsValid){
return BadRequest(ModelState.GetErrorMessages());
}
var profile = mapper.Map<SaveProfileResource, Profile>(resource);
var result = await profileService.SaveAsync(profile);
if(!result.Success){
return BadRequest(result.Message);
}
var profileResource = mapper.Map<Profile, ProfileResource>(result.Profile); //displaying the result to the user
return Ok(profileResource);
}

使用我当前的"原始"实现,我得到了一个

"无法将 JSON 值转换为 x.y.z.Models.EGender. 路径:">

错误。我的问题是:

我需要做什么才能发送包含性别枚举描述的请求。

试试这个

[JsonConverter(typeof(StringEnumConverter))]
[Required]
public EGender Gender {get; set;}

为此,您需要安装"Newtonsoft.Json"软件包。 可以使用Visual Studios NuGet Package UI或使用shell进行编码:

dotnet add package Newtonsoft.json

然后在您的类中使用它们:

using Newtonsoft.Json; //for JsonConverter
using Newtonsoft.Json.Converters; //for StringEnumConverter

另外不要忘记在你的startup.cs/program.cs中设置这个配置:

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(opt =>
{
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}

另一个解决方案是为此使用映射配置文件(不确定这是否是正确的术语(。

public class ResourceToModelProfile : Profile
{
public ResourceToModelProfile()
{
CreateMap<SaveProfileResource, Profile>()
.ForMember(src => src.Gender,
opt => opt.MapFrom(src => Enum.Parse(typeof(EGender), src.Gender)));
}
}

就像一个魅力,除了我需要使用实际的变量名称而不是描述(在这种情况下,这并没有太大的区别,因为两者匹配(

最新更新