なぜこれが間違っているのですか?
{
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
Some Code--Some Code---Some Code
return View();
}
[HttpPost]
public ActionResult Index()
{
Some Code--Some Code---Some Code
return View();
}
}
「getted」の場合と「posted」の場合に1つのことに答えるコントローラーをどのように作成できますか?
同じ名前とシグネチャを持つ2つのメソッドを使用することはできないため、 ActionName
属性を使用する必要があります。
[HttpGet]
public ActionResult Index()
{
Some Code--Some Code---Some Code
return View();
}
[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
Some Code--Some Code---Some Code
return View();
}
「メソッドがアクションになる方法」 も参照してください
ASP.NET MVCでは同じ名前の2つのアクションを持つことができますが、.NETでは同じ署名を持つ2つのメソッド、つまり同じ名前とパラメーターを持つことはできません。
メソッドに異なる名前を付けてActionName属性を使用し、ASP.NET MVCに実際には同じアクションであることを伝える必要があります。
とはいえ、GETとPOSTについて話している場合、POSTアクションはGETよりも多くのパラメーターを受け取るため、この問題は解消される可能性が高いため、区別できます。
したがって、次のいずれかが必要です。
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost, ActionName("ActionName")]
public ActionResult ActionNamePost() {...}
または、
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost]
public ActionResult ActionName(string aParameter) {...}
POSTアクションのフォーム投稿は、たとえ必要ではなくても受け入れたいです。私にとっては、おそらくあなたがsomethingを投稿しているので、正しいことのように感じます。
public class HomeController : Controller
{
public ActionResult Index()
{
//Code...
return View();
}
[HttpPost]
public ActionResult Index(FormCollection form)
{
//Code...
return View();
}
}
特定の質問に答えるために、1つのクラスに同じ名前と同じ引数を持つ2つのメソッドを含めることはできません。 HttpGet属性とHttpPost属性を使用しても、メソッドは区別されません。
これに対処するために、通常、投稿するフォームのビューモデルを含めます。
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
Some Code--Some Code---Some Code
return View();
}
[HttpPost]
public ActionResult Index(formViewModel model)
{
do work on model --
return View();
}
}
同じ名前と同じパラメータをマルチアクションにすることはできません
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(int id)
{
return View();
}
ただし、int int idは使用されません
同じ名前のアクションを複数持つことはできません。 1つのメソッドにパラメーターを追加できますが、それは有効です。例えば:
public ActionResult Index(int i)
{
Some Code--Some Code---Some Code
return View();
}
リクエスト動詞のみが異なるアクションを実行するには、いくつかの方法があります。私のお気に入りで、最も簡単に実装できるのは、 AttributeRouting パッケージを使用することです。インストールしたら、次のようにメソッドに属性を追加するだけです。
[GET("Resources")]
public ActionResult Index()
{
return View();
}
[POST("Resources")]
public ActionResult Create()
{
return RedirectToAction("Index");
}
上記の例では、メソッドの名前は異なりますが、両方の場合のアクション名は「リソース」です。唯一の違いは、リクエスト動詞です。
パッケージは、次のようにNuGetを使用してインストールできます。
PM>インストールパッケージAttributeRouting
AttributeRoutingパッケージへの依存を望まない場合は、カスタムアクションセレクター属性を記述することでこれを行うことができます。
あなたはこの質問に対する良い答えを受け取りましたが、私は2セントを足したいと思います。 1つのメソッドを使用して、リクエストタイプに応じてリクエストを処理できます。
public ActionResult Index()
{
if("GET"==this.HttpContext.Request.RequestType)
{
Some Code--Some Code---Some Code for GET
}
else if("POST"==this.HttpContext.Request.RequestType)
{
Some Code--Some Code---Some Code for POST
}
else
{
//exception
}
return View();
}
今日、私は同じ質問についていくつかのリソースをチェックしていましたが、非常に興味深い例が得られました。
同じメソッドを呼び出すことは可能です GETおよびPOSTプロトコルにより、しかしそのようなパラメーターをオーバーロードする必要があります:
@using (Ajax.BeginForm("Index", "MyController", ajaxOptions, new { @id = "form-consulta" }))
{
//code
}
アクション:
[ActionName("Index")]
public async Task<ActionResult> IndexAsync(MyModel model)
{
//code
}
デフォルトでは、明示的なプロトコルのないメソッドはGETですが、その場合、メソッドがPOSTのように機能するように宣言されたパラメーターがあります。
GETを実行する場合、パラメーターは重要ではありませんが、POSTを実行する場合、リクエストにはパラメーターが必要です。