4

1 番目のルートが機能します。

例えばapi/Shelves/SpaceTypes/1

2 番目のルートは機能しません。複数のアクション エラーが発生します。

例えばapi/Shelves/1

Q)なぜですか?

これらは私のルートです:

config.Routes.MapHttpRoute(
    "DefaultApiWithAction",
    "api/{controller}/{action}/{id}"
);

config.Routes.MapHttpRoute(
    "DefaultApiWithId",
    "api/{controller}/{id}",
    null,
    new { id = @"\d+" }
);

これは私のコントローラーです:

public HttpResponseMessage Get(int id)
{
     ...
}

[ActionName("SpaceTypes")]
public HttpResponseMessage GetSpaceTypes(int id)
{
     ...
}
4

5 に答える 5

11

MVC 4.5の場合、これが機能する唯一のものです

現在、これに関するバグがあります。

ルーティングを機能させるには、次の作業を行います

api/Shelves/ //Get All Shelves
api/SpaceTypes/1 //Get Shelf of id 1
api/Shelves/1/SpaceTypes/  //Get all space types for shelf 1

次のことを行う必要があります。

にルーティングを変更します。(デフォルトのアクションに注意してください..)

config.Routes.MapHttpRoute(
    name : "DefaultAPi",
    routeTemplate : "api/{controller}/{id}/{action}",
    defaults: new {id= RouteParameter.Optional, 
    action = "DefaultAction"}
);

コントローラーで、基本メソッドを次のように変更します

[ActionName("DefaultAction")]
public string Get()
{
}

[ActionName("DefaultAction")]
public string Get(int id)
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}

これで、すべてが期待どおりに動作するはずです..

完全な説明については、Kip Streithorst に感謝します。

于 2013-06-26T13:41:44.080 に答える
0

このルートは、バインドするアクションを認識していません:

config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" });

どちらの方法も有効な候補です。
セットアップが100%明確ではありませんが、通常のRESTではすべてのリソースにコントローラーがあり、2つのリソースを持つコントローラーが1つあるようです。
このセットアップで機能させるには、次のように 2 番目のルートを get アクションに強制することができます。

 config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+", action="Get" });
于 2013-06-26T11:56:14.677 に答える