2017-07-25 4 views
0

私は自分のコントローラに2つのWeb APIメソッドを用意しようとしています。 1つは、ヘッダーにMyViewModelオブジェクトを指定してGETを呼び出したときのものと、そうでないものの1つです。私は、パラメータのないメソッドをコメントアウトし、休憩を入れた場合GETとパラメータなしのGETはAmbiguousActionExceptionを引き起こしますか?

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

MyController.Get (MyProject)

MyController.Get (MyProject)

MyController.cs:

[Produces("application/json")] 
[Route("api/[controller]")] 
public class MyController : Controller 
{ 
    [HttpGet] 
    public IEnumerable<UserModel> Get() 
    { 
     // ... 
    } 

    [HttpGet] 
    public IEnumerable<UserModel> Get(MyViewModel viewModel) 
    { 
     // ... 
    } 
} 

しかし、いずれにMyViewModelを通過することなくChromeのルートアドレスにブラウジングは私に、このエラーが発生しますパラメータ化された関数を指し、APIのURLを参照すると、私は期待したようにがnullであるのではなく、それは新しいMyViewModelオブジェクトであるようですエスコンストラクタ。私の問題に関連しているようです。

私はMicrosoft.AspNetCore v1.1.2デベロッパーMicrosoft.AspNetCore.Mvc v1.1.3デベロッパー上で実行していますよ。

答えて

2

属性ルーティングをそのいずれかに追加します。 例:

[HttpGet("/myaction")] 
    public IEnumerable<UserModel> Get(MyViewModel viewModel) 
    { 
    // ... 
    } 

またはすべてに追加します。 MVCはviewModelがヌルになる可能性があり、最初に一致するかどうかわからないので、2つの方法を区別できません。actionまたは別のものを取得します。 ASP.NETコアで

1

One for when GET is called with a MyViewModel object in the header, and one without.

Model Bindingデフォルトでモデルの人口ではなく、ヘッダのソースとしてクエリパラメータを使用しています。

public IEnumerable<UserModel> Get([FromHeader] MyViewModel viewModel) 

ASP.NETコアrouting実装が解決ルーティングのためのヘッダーを使用していない:あなたはヘッダからMyViewModelを埋めるために必要がある場合は、[FromHeader]属性を使用します。 @Vladoは、属性ルーティングを使用しているので、アクションを明確にするために別のルート名を使用する必要があります。

関連する問題