私は 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 の新しいインスタンスを作成することはできません。既存のインスタンス (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)));
}
私の問題は、クライアントが本文でhttp://localhost:4200/templateでPOST を呼び出すときです : {"Name":"example","Currency":"EUR"}
Model Bindel は Currency.EUR インスタンスの「EUR」を変換できないため、モデル バインダーがインスタンス Currency.EUR を使用して Currency プロパティを持つ Template を作成するのに役立つ何かを提供したい
生成されるエラーは次のとおりです。プロパティ「Currency」の値を読み取ろうとしたときに、null 以外の値を持つ「PrimitiveValue」ノードが見つかりました。ただし、null 値を持つ「StartArray」ノード、「StartObject」ノード、または「PrimitiveValue」ノードが予期されていました。
私のプロジェクトでは、内部に Currency プロパティを持つ多くのクラスがあります。
Template クラスで IModelBinder を使用しようとしましたが、動作しますが、通貨プロパティの modelBinder を書きたくありません。
JsonConverterで試してみましたが、うまくいきません(何か間違っているかもしれません)
私の期待される結果は、次の値を持つ Template インスタンスです。
Id = defaluf(Guid)
Name = "example"
Currency = Currency.EUR