2012-03-04 19 views

答えて

130

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

"How a Method Becomes An Action"

+0

私は聞いてその遅すぎるを知っています。異なるパラメータをとる同じ名前の2つの異なるHttpPostアクションメソッドを持つことは可能です。私はすでにHttpPostメソッドが定義されている作成メソッドにフィルタを適用する必要がある場合について話しています – Vini

+0

はい、有効な.Netメソッドシグネチャであるため可能です。これらのメソッドはオーバーロードされています(メソッドのオーバーロード)。 – nwolisa

2

できないマルチアクションと同じ名前と同じパラメータ

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

でもint型IDは使用されません

+1

idがnullでないintの場合は本当に動作しますか? – jahu

5

あなたの特定の質問に答えるために、単一のクラスに同じ名前と同じ引数を持つ2つのメソッドを持つことはできません。 HttpGetおよびHttpPost属性を使用しても、メソッドを区別することはできません。

は、この問題に対処するため、私はあなたが投稿しているフォームのビューモデルを含め、一般的だろう:ASP.NET MVCは、同じ名前、.NETを持つ2つのアクションを持つことができるようになる一方で

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(); 
    } 

} 
32

同じシグネチャ、つまり同じ名前とパラメータを持つ2つのメソッドを持つことはできません。

メソッドに名前を付けて、実際には同じ動作であることをASP.NET MVCに指示するためにActionName属性を使用する必要があります。

GETとPOSTについて話している場合、POSTアクションはGETよりも多くのパラメータを取り、区別できるため、この問題は解消される可能性があります。

だから、あなたはどちらかが必要です。

[HttpGet] 
public ActionResult ActionName() {...} 

[HttpPost, ActionName("ActionName")] 
public ActionResult ActionNamePost() {...} 

あるいは、

[HttpGet] 
public ActionResult ActionName() {...} 

[HttpPost] 
public ActionResult ActionName(string aParameter) {...} 
2

あなたが同じ名前を持つ複数のアクションを持つことはできません。 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パッケージに依存したくない場合は、カスタムアクションセレクタを書き込むことによってこれを行うことができます属性。

12

POSTアクションのフォームポストを受け入れるのは、私が必要ない場合でも好きです。私にとっては、ちょうどあなたが投稿していると思われるような正しいことが感じられる。何か

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

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

簡単な説明 – Ali

+1

[AllowHtml]などであっても、HttpRequestValidationExceptionが発生しますが、それは悪い例外ではありませんが、その実装とトリガされたとき(特に領域内でトリガされたとき)は不必要です不透明 – Ted

1

あなたはこの質問によく答えましたが、私は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(); 
} 
関連する問題