43

MVC4 で新しい Api コントローラーを使用すると、問題が見つかりました。次の方法がある場合:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

これは機能します。ただし、別のタイプの別のデータを取得したい場合は、メソッドに設定されGetAllていても、デフォルトでメソッドに$.getJSON設定されGetAllIntegersます。

public IEnumberable<int> GetAllIntergers()

(命名規則が悪い)

私がこれを行うことは可能ですか?

GetAllWeb API コントローラーでメソッドを1 つだけ持つことはできますか?

自分が達成しようとしていることを視覚化する方が簡単だと思います。これは、私ができるようにしたいことを示すコードのスニペットですApiController

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}
4

2 に答える 2

63

これはすべてルーティングにあります。デフォルトの Web API ルートは次のようになります。

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

既定のルーティング テンプレートでは、Web API は HTTP メソッドを使用してアクションを選択します。その結果、パラメーターのない GET 要求を最初GetAllに見つけたものにマップします。これを回避するには、アクション名が含まれるルートを定義する必要があります。

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

その後、次の URL でスターを付けてリクエストを作成できます。

  • API/yourapicontroller/GetClients
  • api/yourapicontroller/GetStaffMembers

GetAllこのようにして、コントローラーに複数持つことができます。

ここでもう 1 つ重要なことは、このスタイルのルーティングでは、許可された HTTP メソッド ([HttpGet] など) を指定するために属性を使用する必要があるということです。

デフォルトの Web API 動詞ベースのルーティングと従来のアプローチを混在させるオプションもあります。ここで詳しく説明します。

于 2012-04-12T11:13:43.190 に答える
10

他の誰かがこの問題に直面した場合。これが私がこれを解決した方法です。コントローラーで [Route] 属性を使用して、特定の URL にルーティングします。

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()
于 2015-03-03T18:00:54.947 に答える