bugfix> c# > 投稿

私は、大規模なコレクションに適用するために、ソートおよびページネーション情報を送信するために使用するクラスを作成しました。要求を受け取り、入力 FromQuery としてオブジェクトを受け取る.NET Core Web APIサービスがあります 。特定の命名規則(つまり、Microsoft Rest APIのガイドライン) $orderby などのパラメーター名の場合 、 $top$skip など、および JsonProperty を使用してクラスのプロパティに注釈を付けました 。

ただし、生成されたswagger docでは、これらは単にプロパティ名そのものとして表示されるだけで、これは私のプロパティの名前が Take の場合に問題ですたとえば、リクエストパラメータは $top である必要があります 。 APIの利用者に混乱を引き起こさないために、生成されたドキュメントを一致させたいと思います。私が読んだものはすべて、これが機能するはずであるように思われるので、なぜそれが私に合わないのか困惑しています。

これは、 Newtonsoft.Json.JsonPropertyAttribute を使用した注釈付きの私のクラスです

[JsonObject]
public class QueryParams {
    [JsonProperty( "$orderBy" )]
    public string OrderBy { get; set; }
    [JsonProperty( "$skip" )]
    public int? Skip { get; set; }
    [JsonProperty( "$top" )]
    public int? Take { get; set; }
    [JsonProperty( "$maxpagesize" )]
    public int? MaxPageSize { get; set; }
    [JsonProperty( "$count" )]
    public bool? IncludeCount { get; set; }
}

そして、たとえば私のWeb APIアクションメソッドは次のようになります

   [HttpGet( "type/{type}" )]
    public async Task<IActionResult> GetByType( 
        string type, 
        [FromQuery]QueryParams parameters ) 
    {
       /* ... */ 
    }

MapType を使用するなど、いくつかのことを試しましたで述べたように 特定のタイプのスキーマをオーバーライドする しかし、運がありません。これに関してだれでも提供できる洞察に感謝します。

回答 1 件
  • このGitHubの問題によると、 JsonSerializer  GETリクエストのクラスへのバインドには使用されません。代わりに、モデルバインディングをカスタマイズする必要があります。

    So, when you use a class to represent query parameters, the JsonSerializer isn’t involved. Instead, MVC model binding is used to assign values directly from the request into the instance properties.

    So, if you want to be explicit about required casing for this behavior, and hence the generated description, you need to customize the model binding behavior too. I’m not at my laptop now but off the top of my head, I think you can annotate properties with “FromQuery” and set the bind name that way.

    GH問題の議論を正しく理解していれば、次のように動作するはずです。

    public class QueryParams {
        [FromQuery( Name = "$orderBy" )]
        public string OrderBy { get; set; }
        [FromQuery( Name = "$skip" )]
        public int? Skip { get; set; }
        [FromQuery( Name = "$top" )]
        public int? Take { get; set; }
        [FromQuery( Name = "$maxpagesize" )]
        public int? MaxPageSize { get; set; }
        [FromQuery( Name = "$count" )]
        public bool? IncludeCount { get; set; }
    }
    
    

あなたの答え