web-dev-qa-db-ja.com

Web APIオプションパラメータ

次のシグネチャを持つコントローラーがあります。

[Route("products/filter/{apc=apc}/{xpc=xpc}/{sku=sku}")]
public IHttpActionResult Get(string apc, string xpc, int? sku)
{ ... }

次のURIでこのメソッドを呼び出します。

  • 〜/ api/products/filter?apc = AA&xpc = BB
  • 〜/ api/products/filter?sku = 7199123

最初のURIは問題なく機能します。 2番目のものには、奇妙な副作用があります。 apcおよびxpcのデフォルト値は指定されていない場合はnullである必要がありますが、パラメーターは実際にはその名前です。追加のロジックを追加することでこれを克服できます。

apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;

これはハックのように見え、渡された値がパラメーター名と等しい場合に問題になります。

この副作用なしでルートを定義する方法はありますか?

21
Josh

私はそれを考え出した。クエリ文字列をメソッドパラメータにマップする方法の過去に見つけた悪い例を使用していました。

他の誰かがそれを必要とする場合、クエリ文字列に次のようなオプションのパラメータを含めるために:

  • 〜/ api/products/filter?apc = AA&xpc = BB
  • 〜/ api/products/filter?sku = 7199123

あなたが使用します:

[Route("products/filter/{apc?}/{xpc?}/{sku?}")]
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }

これらの型に既にデフォルトがある場合、メソッドパラメータのデフォルト値を定義する必要があるのは奇妙に思えます。

62
Josh

Skuはintであり、文字列「sku」にデフォルト設定することはできません。 オプションのURIパラメーターとデフォルト値 を確認してください

4
Petre T