1

ASP.NET MVC4 で REST API を作成していますが、ルーティングに問題があります。参考までに、私はすでにこれらの質問を読みましたが、私の問題に答えていません:

私が作成しようとしている URL は次のようになります。

  1. GET /account/id (id は Guid) - GET /account/?id=x と同等
  2. GET /account/first%20last%20name (name は文字列) - GET /account/?name=x と同等
  3. GET /pendingregistrations/?page=y (ここではアクションは省略)
  4. POST /pendingregistrations/denyregistration?denyId=x (ここではアクションが指定されています)

ご覧のとおり、場合によっては、コントローラー名の後の URL がパラメーター (上記の 1、2 の ID と名前) にマップされ、場合によってはアクション名 (上記の 4) にマップされます。さらに、まったく存在しない可能性があります (上記の #3)。その場合、デフォルトのアクションを想定しています。ほとんどすべてのケースで機能するルーティングは次のとおりです。

    // Match for an id next.
    config.Routes.MapHttpRoute(
        name: "WithIdApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { action = "Index" },
        constraints: new
        {
            id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$"
        }
    );

    // Match for a name next.
    config.Routes.MapHttpRoute(
        name: "WithNameApi",
        routeTemplate: "api/{controller}/{name}",
        defaults: new { action = "Index" }
    );

    // Match for an action last.
    config.Routes.MapHttpRoute(
        name: "WithActionApi",
        routeTemplate: "api/{controller}/{action}",
        defaults: new { action = "Index" }
    );

MVC は 'name' パラメーターと 'action' バインディングの違いを認識できないため、このコードは上記の例 4 を除くすべてで機能します。順序を変更すると (つまり、アクションの一致を上に置く)、'name' パラメーターの例が機能しなくなります。

これを達成できる方法を知っている人はいますか?

4

1 に答える 1

1

これをやろうとしている他の人にとっては、答えは不可能です。最善の方法は、「名前」検索を独自のアクションに移動することです。例えば:

  • GET /account/id (id は Guid です)
  • GET /アカウント/名前/first%20last

いずれかが失敗し、他のバインディングが利用可能である場合、MVC はパラメーターまたはアクションの一致を試みたと思いますが、残念ながらそうではありません。

于 2013-02-19T20:11:08.117 に答える