ASP.NETMVCの同じコントローラーアクションへのGETとPOST


91

単一のアクションでGetsとPostsの両方に応答するようにしたいと思います。私は以下を試しました

[HttpGet]
[HttpPost]
public ActionResult SignIn()

それはうまくいかなかったようです。助言がありますか ?


2
問題を説明するには:アクションは無視されます。各属性は他のすべてのリクエストメソッドを除外するため、アクションはリクエストメソッドをまったく受け入れないことになります。
グッファ2011年

ASP.NETMVC2およびVisualStudio2010では、OPの例( "[AcceptVerbs(HttpVerbs.Get)]"など)でコンパイルエラーが発生します: "Duplicate'AcceptVerbs'attribute"。
DaveD 2012

4
@デイブあなたはやっています[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)][AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]?これらの属性については何も知りませんが、2番目の属性を実行している場合は、そのエラーが発生する可能性があります。
Jared 2012

回答:


134

これは、AcceptVerbs属性を使用して可能です。その少し冗長ですが、より柔軟です。

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}

msdnの詳細。


3
はい。ただし、メソッドがパラメーターを使用する場合(たとえば、SignIn(SingInParams parameters)... GETの場合はURIから取得され(したがって[FromUri]を指定する必要があります)、POSTの場合は本体から取得されます(したがって[ FromBody]を指定する必要があります)?
michal.jakubeczy 2016年

64

アクションはデフォルトでGETとPOSTの両方に応答するため、何も指定する必要はありません。

public ActionResult SignIn()
{
    //how'd we get here?
    string method = HttpContext.Request.HttpMethod;
    return View();
}

必要に応じて、HttpContext.Request.HttpMethod値を操作することにより、HttpMethodに応じて異なるロジックを実行できます。


5
ビューモデルを使おうとするまではこれで問題ありません。通常ビューモデルに渡すpostアクションでは、オプションのparamを使用して、デフォルトでnullに設定しようとしましたが、機能しません。
JBeckton 2011年

1
@JBeckton通常、クエリ文字列パラメータのみを持つGETメソッドがSignIn(Guid? UserId)あり、POSTにはビューモデルがSignIn(SomeVM vm)あり、両方とも共有プライベートメソッドを呼び出しSignInHandleGetPost(...)ます...これは、GETメソッドが初期化する必要があるVM、オプションのパラメータ、または任意の方法を使用する可能性がありますruseable / sharedコードをリファクタリングするため。
AaronLS 2013

2
@JBeckton ASP.NET MVC 4.6.1サンプルプロジェクトでメソッドAccountController.Login(String returnUrl, LoginViewModel model)を使用して試してみましたが、正常に動作します。modelGETではnull、POSTでは非nullです。ただし、GET要求で例外がスロー[ValidateForgeryToken]されるためValidateForgeryToken、オーバーライドする必要があります。
2016

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

それは私が探しているものではありません。それは、関数のオーバーロードを介してGETとPOSTに別々のメソッドを持つデフォルトのMVC実装です。私はMVCに不慣れではありません。フォームコレクションの標準のPOSTアクションに加えて、GETアクションが特定のPOSTイベントにも応答するようにしようとしています。
Cranialsurge 2010

次に、カートの答えに従う必要があります。両方を処理する属性はありません。POSTリクエストを別のアクションに送信しようとしている場合、それは不可能です。あなたの行動はあなたが探している切り替えを実行する必要があります。
ジェレミーB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.