我正在.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)));
}
}
就像一个魅力,除了我需要使用实际的变量名称而不是描述(在这种情况下,这并没有太大的区别,因为两者匹配(