0

Web APIを使用して、次の2つのRestfulルートを2つの異なるアクションメソッドにリダイレクトする必要があります。

/ products/2- >製品ID2の情報を取得

/ products?someOptionalId=456- >すべての製品の情報を取得します。提供されている場合は、フィルターとしてsomeOptionalIdを使用します。

残念ながら、標準のルーティングとモデルバインディングスキームを使用すると、両方のURLが同じ製品コントローラーを指し、パラメーターとして1つのIDを持つため、同じintパラメーターを持つ2つのGetメソッドを作成するコンパイル時の問題、またはMVCが特定のアクションメソッドを選択できない

コンパイル時エラー

public IQueryable<Product> Get(int someOptionalIdQs)
{

}

public Product Get(int id)
{

}

実行時エラー(一部のOptionalIdQに文字列を使用してからintに変換するハックに注意してください)

public IQueryable<Product> Get(string someOptionalIdQs)
{

}

public Product Get(int id)
{

}

ルーティングを可能な限りクリーンに保ちたいので、ルーティング構成を変更せずに、理想的には修正を提案してください。ありがとう。

4

3 に答える 3

2

メソッドにはオプションのIdパラメーターがあるため、コレクションのGetにnull許容のintを使用できます。

以下のコードは、次のURLをサポートします。

  • http:// server / api / products
  • http:// server / api / products?someOptionalIdQs = 3
  • http:// server / api / products / 2

コード例

public class Product
{
    public string Name { get; set; }
}

public class ProductsController : ApiController
{
    public IQueryable<Product> Get([FromUri] int? someOptionalIdQs = null)
    {
        if(someOptionalIdQs.HasValue)
        {
            //apply the filter
        }
        return new List<Product>().AsQueryable();
    }

    public Product Get(int id)
    {
        return new Product();
    }
}
于 2012-11-14T08:49:29.800 に答える
0

最初のアプローチを使用しますが、Get メソッドの 1 つの名前を変更してみてください。アクション名に「Get」というプレフィックスがない場合は、[HttpGet] 属性が使用されていることを確認してください。

    // [HttpGet]
    public IQueryable<Product> Get2(int someOptionalIdQs)
    {
    }

    public Product Get(int id)
    {
    }
于 2012-11-14T06:56:42.617 に答える
0

できることは、オプション ID Q に従って処理を行うかどうかを確認することです。それ以外の場合はthis.HttpContext.Request.QueryString.AllKeys.Contains("someOptionalIdQs")、通常のワークフローが機能します。

ただし、これは暗号化された実装になるため、理想的には、アプリの別のワークフロー用に新しい URL をまとめて作成する必要があります。

于 2012-11-14T08:55:49.657 に答える