2

私は 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
4

2 に答える 2