Запрос на публикацию, включающий описание Enum - PullRequest
1 голос
/ 10 октября 2019

Я делаю простой API в ядре .net и пытаюсь реализовать сообщение, где мне нужно обработать значение enum.

Я использую «SaveProfileResource» для этого, которыйиспользуется AutoMapper в моем классе контроллеров.

Я специально хочу сделать запрос на публикацию с таким телом:

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

, где Gender - Enum.

код выглядит примерно так:

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 не может быть преобразовано в xyzModels.EGender. Путь:"

ошибка. Мой вопрос:

что мне нужно сделать, чтобы я мог отправить запрос, содержащий описание Ender Gender.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

попробуйте

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

, для этого вам необходимо установить пакет "Newtonsoft.Json". Это можно сделать с помощью пользовательского интерфейса пакета Visual Studios NuGet или при кодировании с использованием оболочки:

dotnet добавить пакет Newtonsoft.Json

и затем использовать их в своем классе:

using Newtonsoft.Json; //for JsonConverter
using Newtonsoft.Json.Converters; //for StringEnumConverter
0 голосов
/ 10 октября 2019

Другое решение состоит в том, чтобы использовать для этого профиль сопоставления (не уверен, что это правильная терминология).

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

Работает как шарм, за исключением того, что вместо этого мне нужно использовать реальные имена переменныхописаний (которые в данном случае не имеют большого значения, поскольку оба совпадают)

...