92 votes

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éponde à une chose lorsqu'il est « obtenu » et une autre lorsqu'il est « publié » ?

203voto

BrokenGlass Points 91618

Comme vous ne pouvez pas avoir deux méthodes avec le même nom et la même signature, vous devez utiliser l'attribut ActionName

 [HttpGet]
public ActionResult Index()
{
  // your code
  return View();
}

[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
  // your code
  return View();
}

Voir aussi "Comment une méthode devient une action"

17voto

jocull Points 3718

J'aime accepter un post de 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é publier quelque chose .

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

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

5voto

Jeff Siver Points 4710

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 même classe ; l'utilisation des attributs HttpGet et HttpPost ne distingue pas les méthodes.

Pour résoudre ce problème, j'inclurais 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();
    }

}

5voto

RredCat Points 1701

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X