4

OData Uri 規則http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOptionに従って、次の Uri が有効です。 http://services.odata.org/OData/OData.svc/Category(1)/Products ?$top=2&$orderby=名前

ただし、ASP.NET Web-API はこれをサポートしていないようです (少なくともそのままでは)。Category(1) という名前のコントローラーが見つからないというエラーが表示されます。

これを Web-API で機能させる方法、または回避策はありますか?

4

1 に答える 1

5

あなたが質問したときになぜあなたの質問が注目を集めなかったのかわかりません..しかし、それは本当の問題です. WebAPI は多くの OData 仕様をサポートしていますが、私の理解ではすべてではありません。ただし、どの側面が機能するかを正確に説明しているリソースをまだ見つけていません。デフォルトのルートは、例のように2つではなく、1つのネストレイヤーをサポートしています。次のようなもの:

mystuff.com/Category/5?$top2&orderby=name

そうは言っても、あなたが望むようなものを作ることができると思います。私はこれをすべてコンパイル/テストしていないので、我慢してください....global.asaxセットアップでは、次のようなルートのペアを設定します。

routes.MapHttpRoute(name          : "WithCategoryFilter", 
                    routeTemplate : "api/v1/{controller}({catID})/{action}/{id}",
                    defaults      : new { id = RouteParameter.Optional}        );

routes.MapHttpRoute(name          : "WithoutCatFilter", 
                    routeTemplate : "api/v1/{controller}/{action}/{id}",
                    defaults      : new { id = RouteParameter.Optional}        );

ルートを登録した順序に注意してください。最初にカテゴリ フィルターを配置します。これらのルートに対応するコントローラは次のようになります: :

 public class ProductCategoryController : BaseAPIController {
     public IEnumerable<Product> Products(int catID, int id) {
         var result = new List<Product>();

         //do category filtering here...

          return result;
     }
 }

したがって、最初のルートでは、カテゴリ フィルタ ( catID) とオプションの ProductID ( id) を適用できます。カテゴリ ID と括弧が除外されると、2 番目のルートがキャッチされます。かっこを自動的に除外する優れた方法がないため、2 つのルートが必要です。

補足として、私が書いた別の回答に興味があるかもしれません。これは、おそらく遭遇する他のルート体操を特定しています.

于 2012-05-27T21:05:40.410 に答える