2016-05-25 16 views
3

私のWebアプリケーションでは、同じパスを使用して異なるタイプのパラメータを渡すことをクライアントが要求できるようにします。例えばオーバーロードされたコントローラメソッドの同じURL

public class MyController : ApiController 
{ 
    [HttpDelete] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    public IHttpActionResult Delete3(string id) {..} 

} 

私は、たとえば、各メソッドのURLが似ているようにしたい:

api/MyController/1 
api/MyController/abc etc.. 

これは可能ですか? Iv'eはActionNameアトリビュートとルーティング設定の組み合わせを試してみましたが、何も動作していないようです。

おかげ

+1

それらはすべて同じことをやっている場合は、私はこれらの(NULL可能)の各プロパティを保持するためのカスタムクラス(オブジェクト)を作成し、1つのルートを使用することをお勧め。 –

答えて

6

あなたはこのためattribute routingを使用することができます。例:あなたがこれを行う場合は

[RoutePrefix("MyController")] 
public class MyController : ApiController 
{ 
    [HttpDelete] 
    [Route("delete/{id:int}")] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    [Route("delete/{id:guid}")] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    [Route("delete/{id:alpha}")] 
    public IHttpActionResult  Delete3(string id) {..} 

} 

は、リクエストURLは次のようになります。

http://yoursever/mycontroller/delete/123 
http://yoursever/mycontroller/delete/abc 
http://yoursever/mycontroller/delete/91c74f8f-d981-4ee1-ba36-3e9416bba202 
+1

これは有効なケースですか?* api/MyController/"abc" * ?? – SamGhatak

+0

文字列を引用符で囲む必要はありません – Nasreddine

+1

私は混乱していますが、OPは* api/MyController/"1" *と* api/MyController/1によって 'string'と' int'を区別したいようです。 * .... – SamGhatak

3

あなたの方法ごとに異なるパラメータ型でRouteを提供する必要があります。

[RoutePrefix("api/MyController")] 
public class MyController : ApiController 
{ 
    [HttpDelete] 
    [Route("{id:int}", Order = 1)] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    [Route("{id:guid}", Order = 2)] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    [Route("{id}", Order = 3)] 
    public IHttpActionResult Delete3(string id) {..} 

} 

もちろん、まだ持っていない場合はenable attribute routingにしてください。
Route属性のOrderプロパティは、int値が文字列ルートと一致しないように、ルートテンプレートが正しい順序でチェックされるようにします。

0

はい、可能です。ルートをdecorationとして設定してみてください。

例:

 [Route("DeleteThis/{id}")] 
     [HttpDelete] 
     public IHttpActionResult DeleteThis(int id) 
     { 
      return Ok(); 
     } 

     [Route("NowDeleteThis/{name}")] 
     [HttpDelete] 
     public IHttpActionResult DeleteThis(string name) 
     { 
      return Ok(); 
     } 
+0

URLを変更できませんか? –

+0

はい、ただし、メソッド名は変更されません。 –

+1

ルートの終わりにフォワードスラッシュとは何ですか? –

関連する問題