2017-05-10 8 views
0

私はMVCコントローラを持っていて、「作成」ビューにリンクしています。WebAPI-MVCのGETメソッドとPOSTメソッドを明確にすることはできます

いくつかの前処理を行い、ビューを表示し、次に「POST」メソッドを使用してデータベースを適切に更新するために、「GET」メソッドが必要です。

いくつかのガイドを読んで、それで答えを得た後、次のようなものが正しい解決策だと思います。しかし

<HttpGet> 
    Public Function Create() As ActionResult 
     'Do Stuff 
     Return View(New MyClass) 
    End Function 

    <HttpPost> 
    Public Function Create(MyObject As MyClass) As ActionResult 
     'Process results 
    End Function 

、私は http://my.site/MyController/Createにアクセスしようと、私は例外を取得:

System.Reflection.AmbiguousMatchException: The current request for action 'Create' on controller type 'MyControllerController' is ambiguous 

エンジンは、彼らがGETとPOSTに設定されている場合でも、両者の間に決めることができなかったかのように

私はここで間違っていますか?

+0

投稿したコードに問題はありません。私はErikの答えに同意する傾向があります。実際には適用されません。また、FWIWでは、 'HttpGet'を指定する必要はありません。これがデフォルトです。 –

+0

@ChrisPratt - それはちょうどデフォルトではありません。それはキャッチオールのようなものです。動詞を指定しないと、すべての動詞に使用されます。したがって、取得または投稿を指定することはできますが、そのいずれかを区別する必要があります。 –

答えて

2

おそらく誤った属性を使用している可能性があります。 MVCとWebApiはHttpGetとHttpPutに同じ属性名を使用しますが、それらは異なる名前空間にあります。

MVCの場合

:WEBAPIについては

System.Web.Mvc.HttpGetAttribute 

:あなたはMVCはWEBAPIまたはその逆で属性を使用して(間違ったものを使用している場合

System.Web.Http.HttpGetAttribute 

が、それは無視されます、そしてあなたが取得しますエラーメッセージが表示されました。正しい名前空間があることを確認してください。

+0

」を「」に変更すると、このトリックが行われました。どうもありがとう。 – Maxime

0

コントローラメソッドをオーバーロードすることはできません。アクション名を同じにしたい場合は、次のようにします。

<ActionName("Save")> 
<HttpPost> 
Public Function Create(MyObject As MyClass) As ActionResult 
    'Process results 
End Function 
+0

"コントローラのメソッドをオーバーロードすることはできません。それは真実ではない。あなたは非常に多くのアクションをオーバーロードできます。ルーティングフレームワークは、異なるHTTPメソッドを使用するだけで、ルーティングフレームワークがいつルーティングするかを区別することができません。 –

関連する問題