У меня есть клиент Angular и я создаю запрос POST с этим телом:
{ "Имя": "пример", "Валюта": "EUR"}
Я использую протокол Odata, и мой контроллер:
[HttpPost, ODataRoute("Templates")]
public IActionResult Insert([FromBody] Template value)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
value.Id = Guid.NewGuid();
_context.Templates.Add(value);
_context.SaveChanges();
return Created(value);
}
с шаблоном:
public class Template
{
public Guid Id { get; set; }
public string Name { get; set; }
public Currency Currency { get; set; }
}
и валюта:
[Serializable]
public class Currency : StringEnumeration<Currency>
{
public static Currency EUR = new Currency("EUR", "EUR");
public static Currency USD = new Currency("USD", "USD");
Currency() { }
Currency(string code, string description) : base(code, description) { }
}
Currency - это особый класс, потому что он имеет частные конструкторы, и по этой причине я не могу создать новый экземпляр Currency. Я хочу использовать один из существующих экземпляров (EUR или USD).
(StringEnumeration поддерживает метод Parse и TryParse и возвращает правильный экземпляр)
Стандартная конфигурация:
public void ConfigureServices(IServiceCollection services)
{
services.ConfigureCors();
services.AddOData();
services.ConfigureIISIntegration();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDbContext<GpContext>(option => option
.UseSqlServer(Configuration.GetConnectionString(GpConnection)));
}
Моя проблема, когда клиент вызывает POST на http://localhost:4200/template
с телом: {"Name": "example", "Currency": "EUR"}
Модель Bindel не может конвертировать "EUR" в экземпляре Currency.EUR, поэтому я хочу предоставить кое-что, чтобы помочь связующему модели создать шаблон с свойством Currency с экземпляром Currency.EUR
Это сгенерированная ошибка:
При попытке прочитать значение свойства «Валюта» был обнаружен узел «PrimitiveValue» с ненулевым значением; однако ожидался узел 'StartArray', узел 'StartObject' или узел 'PrimitiveValue' с нулевым значением.
В моем проекте у меня есть много классов со свойством Currency внутри.
Я пытался использовать IModelBinder для класса Template, и он работает, но я не хочу писать modelBinder для любого свойства Currency.
Я пытался с JsonConverter, но у меня это не работает (может, что-то не так)
Мой ожидаемый результат - экземпляр шаблона со следующими значениями:
Id = defaluf(Guid)
Name = "example"
Currency = Currency.EUR