我有一个 Angular 客户端并使用此主体创建一个 POST 请求:
{“名称”:“示例”,“货币”:“欧元”}
我使用 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 的新实例。我想使用现有实例(欧元或美元)。
(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)));
}
我的问题是当客户端在http://localhost:4200/template上调用 POST 时 ,正文为:{"Name":"example","Currency":"EUR"}
Model Bindel 无法在 Currency.EUR 实例中转换“EUR”,所以我想提供一些东西来帮助模型 binder 使用 Currency.EUR 实例创建具有 Currency 属性的模板
这是生成的错误:尝试读取属性“货币”的值时发现了具有非空值的“PrimitiveValue”节点;但是,需要一个“StartArray”节点、一个“StartObject”节点或一个具有空值的“PrimitiveValue”节点。
在我的项目中,我有许多内部带有 Currency 属性的类。
我尝试在模板类上使用 IModelBinder 并且它可以工作,但我不想为任何货币属性编写 modelBinder。
我尝试使用 JsonConverter,但它对我不起作用(可能有问题)
我的预期结果是具有以下值的模板实例:
Id = defaluf(Guid)
Name = "example"
Currency = Currency.EUR