Méthodes GET et POST avec le même nom d’action dans le même contrôleur

Pourquoi est-ce incorrect?

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

Comment puis-je avoir un contrôleur qui répond à une chose quand il est “masqué” et un autre quand “posté”?

Comme vous ne pouvez pas avoir deux méthodes avec le même nom et la même signature, vous devez utiliser l’atsortingbut 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(); } 

Voir aussi “Comment une méthode devient une action”

Bien qu’ASP.NET MVC vous permette d’avoir deux actions avec le même nom, .NET ne vous permettra pas d’avoir deux méthodes avec la même signature, à savoir le même nom et les mêmes parameters.

Vous devrez nommer les méthodes différemment en utilisant l’atsortingbut ActionName pour indiquer à ASP.NET MVC qu’il s’agit bien de la même action.

Cela dit, si vous parlez d’un GET et d’un POST, ce problème disparaîtra probablement, car l’action POST prendra plus de parameters que le GET et sera donc distinguable.

Donc, vous avez besoin soit:

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

Ou,

 [HttpGet] public ActionResult ActionName() {...} [HttpPost] public ActionResult ActionName(ssortingng aParameter) {...} 

J’aime accepter un formulaire pour mes actions POST, même si je n’en ai pas besoin. Pour moi, cela semble être la bonne chose à faire car vous êtes censé poster quelque chose .

 public class HomeController : Controller { public ActionResult Index() { //Code... return View(); } [HttpPost] public ActionResult Index(FormCollection form) { //Code... return View(); } } 

Pour répondre à votre question spécifique, vous ne pouvez pas avoir deux méthodes avec le même nom et les mêmes arguments dans une seule classe; L’utilisation des atsortingbuts HttpGet et HttpPost ne permet pas de distinguer les méthodes.

Pour résoudre ce problème, j’inclus généralement le modèle de vue pour le formulaire que vous publiez:

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

Ne peut pas multi-action même nom et même paramètre

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

althought int id n’est pas utilisé

Vous ne pouvez pas avoir plusieurs actions avec le même nom. Vous pouvez append un paramètre à une méthode et cela serait valide. Par exemple:

  public ActionResult Index(int i) { Some Code--Some Code---Some Code return View(); } 

Il y a plusieurs façons de faire des actions qui ne diffèrent que par le verbe requête. Mon favori et, je pense, le plus facile à mettre en œuvre est d’utiliser le package AtsortingbuteRouting . Une fois installé, ajoutez simplement un atsortingbut à votre méthode comme suit:

  [GET("Resources")] public ActionResult Index() { return View(); } [POST("Resources")] public ActionResult Create() { return RedirectToAction("Index"); } 

Dans l’exemple ci-dessus, les méthodes ont des noms différents mais le nom de l’action dans les deux cas est “Resources”. La seule différence est le verbe de requête.

Le paquet peut être installé en utilisant NuGet comme ceci:

PM> Install-Package AtsortingbuteRouting

Si vous ne voulez pas la dépendance sur les packages AtsortingbuteRouting, vous pouvez le faire en écrivant un atsortingbut de sélecteur d’action personnalisé.

Vous avez reçu la bonne réponse à cette question, mais je veux append mes deux cents. Vous pouvez utiliser une méthode et traiter les requêtes en fonction du type de requête:

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

Aujourd’hui, j’ai vérifié certaines ressources sur la même question et j’ai eu un exemple très intéressant.

Il est possible d’appeler la même méthode par le protocole GET et POST, mais vous devez surcharger les parameters comme ceci:

 @using (Ajax.BeginForm("Index", "MyController", ajaxOptions, new { @id = "form-consulta" })) { //code } 

L’action:

 [ActionName("Index")] public async Task IndexAsync(MyModel model) { //code } 

Par défaut, une méthode sans protocole explicite est GET, mais dans ce cas, il existe un paramètre déclaré qui permet à la méthode de fonctionner comme un POST.

Lorsque GET est exécuté, le paramètre n’a pas d’importance, mais lorsque POST est exécuté, le paramètre est requirejs sur votre demande.