単一のアクションでGetsとPostsの両方に応答するようにしたいと思います。私は以下を試しました
[HttpGet]
[HttpPost]
public ActionResult SignIn()
それはうまくいかなかったようです。助言がありますか ?
単一のアクションでGetsとPostsの両方に応答するようにしたいと思います。私は以下を試しました
[HttpGet]
[HttpPost]
public ActionResult SignIn()
それはうまくいかなかったようです。助言がありますか ?
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
か[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
?これらの属性については何も知りませんが、2番目の属性を実行している場合は、そのエラーが発生する可能性があります。
回答:
これは、AcceptVerbs属性を使用して可能です。その少し冗長ですが、より柔軟です。
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
msdnの詳細。
アクションはデフォルトでGETとPOSTの両方に応答するため、何も指定する必要はありません。
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
必要に応じて、HttpContext.Request.HttpMethod値を操作することにより、HttpMethodに応じて異なるロジックを実行できます。
SignIn(Guid? UserId)
あり、POSTにはビューモデルがSignIn(SomeVM vm)
あり、両方とも共有プライベートメソッドを呼び出しSignInHandleGetPost(...)
ます...これは、GETメソッドが初期化する必要があるVM、オプションのパラメータ、または任意の方法を使用する可能性がありますruseable / sharedコードをリファクタリングするため。
AccountController.Login(String returnUrl, LoginViewModel model)
を使用して試してみましたが、正常に動作します。model
GETではnull、POSTでは非nullです。ただし、GET要求で例外がスロー[ValidateForgeryToken]
されるためValidateForgeryToken
、オーバーライドする必要があります。
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}