我有一个Angular客户端,并使用以下内容创建了POST请求:
{"Name":"example","Currency":"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的新实例。我想使用现有实例之一(如EUR或USD)。
(StringEnumeration支持Parse和TryParse方法,并返回正确的实例)
标准配置:
Original Answer翻译成"最初的回答"
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"}作为body,此时Model Binder无法将Currency中的"EUR"转换为实例Currency.EUR。因此,我想提供一些帮助来帮助Model Binder创建具有Currency属性和Currency.EUR实例的模板。
以下是生成的错误: 尝试读取属性“货币”的值时找到了一个具有非空值的“PrimitiveValue”节点;但是,期望出现“StartArray”节点、“StartObject”节点或具有空值的“PrimitiveValue”节点。
我的项目中有许多包含Currency属性的类。
我尝试在Template类上使用IModelBinder,它可以工作,但我不想为每个Currency属性编写一个modelBinder。
我尝试过JsonConverter,但对我来说它不起作用(可能是某些问题)。
我的预期结果是一个具有以下值的Template实例:
Id = defaluf(Guid)
Name = "example"
Currency = Currency.EUR