Проблема перечисления ядра .Net с использованием FromRoute и EnumMember - PullRequest
0 голосов
/ 08 февраля 2019

У меня возникла проблема, похожая на https://github.com/aspnet/AspNetCore/issues/4008, и я хотел бы помочь с ней вообще.

Для URL http://localhost:51049/api/values/proof_of_address маршрут должен оценивать proof_of_addressкак ProofOfAddress в перечислении ниже.

Я пытался следовать примеру по ссылке выше, но независимо от того, что я вставил в URL, я получаю первое значение в перечислении.Мой код выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddJsonOptions(opt =>
    {
        opt.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None;
        opt.SerializerSettings.Converters.Add(new StringEnumConverter());
    });
}

[HttpGet("{documenttype}")]
public ActionResult<string> Get([FromRoute] DocumentType documenttype)
{
    return documenttype.ToString();
}

public class CustomEnumConverter<T> : TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        var s = value as string;
        if (string.IsNullOrEmpty(s))
        {
            return null;
        }

        return JsonConvert.DeserializeObject<T>(@"""" + value.ToString() + @"""");
    }
}

[TypeConverter(typeof(CustomEnumConverter<DocumentType>))]
public enum DocumentType
{
    [EnumMember(Value = "passport")]
    Passport,

    [EnumMember(Value = "proof_of_address")]
    ProofOfAddress
}

Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Вам нужно переопределить CanConvertFrom, чтобы вернуть true

public class CustomEnumConverter<T> : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return true;
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        var s = value as string;
        if (string.IsNullOrEmpty(s))
        {
            return null;
        }

        return JsonConvert.DeserializeObject<T>(@"""" + value.ToString() + @"""");
    }
}
...