web-dev-qa-db-ja.com

同じコントローラー内の同じアクション名を持つGETおよびPOSTメソッド

なぜこれが間違っているのですか?

{
    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つのことに答えるコントローラーをどのように作成できますか?

74
Ricardo Polo

同じ名前とシグネチャを持つ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();
    }

「メソッドがアクションになる方法」 も参照してください

160
BrokenGlass

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) {...}
36
user1082916

POSTアクションのフォーム投稿は、たとえ必要ではなくても受け入れたいです。私にとっては、おそらくあなたがsomethingを投稿しているので、正しいことのように感じます。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        //Code...
        return View();
    }

    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
        //Code...
        return View();
    }
}
16
jocull

特定の質問に答えるために、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();
    }

}
5
Jeff Siver

同じ名前と同じパラメータをマルチアクションにすることはできません

    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Index(int id)
    {
        return View();
    }

ただし、int int idは使用されません

2
Mason

同じ名前のアクションを複数持つことはできません。 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
Mark

あなたはこの質問に対する良い答えを受け取りましたが、私は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();
}
1
RredCat

今日、私は同じ質問についていくつかのリソースをチェックしていましたが、非常に興味深い例が得られました。

同じメソッドを呼び出すことは可能です 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を実行する場合、リクエストにはパラメーターが必要です。

0
Moacir