2010-07-12 4 views
75

Je souhaite qu'une seule action réponde à la fois aux messages Gets et Posts. J'ai essayé le suivantGET et POST à ​​la même action de contrôleur dans ASP.NET MVC

[HttpGet] 
[HttpPost] 
public ActionResult SignIn() 

Cela n'a pas semblé fonctionner. Aucune suggestion ?

+0

Qu'est-ce qui ne fonctionne pas, et comment cela échoue? –

+0

Pour expliquer le problème: L'action est ignorée. Chaque attribut exclura toutes les autres méthodes de requête, de sorte que l'action finit par n'accepter aucune méthode de requête. – Guffa

+4

Pourquoi la réponse de EvilRyry n'a-t-elle pas été acceptée? Ça a fait l'affaire pour moi. –

Répondre

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

[HttpPost] 
public ActionResult SignIn(FormCollection form) 
{ 
} 
+0

Ce n'est pas ce que je cherche, c'est l'implémentation MVC par défaut d'avoir des méthodes séparées pour GET et POST via la surcharge de fonction. Je ne suis pas nouveau à MVC, j'essaye de faire réagir l'action GET à certains événements POST en plus de l'action POST standard pour la collection de formulaires. – Cranialsurge

+0

Ensuite, vous devez suivre la réponse de Kurts. Aucun attribut ne gérera les deux. Si vous tentez d'envoyer des requêtes POST à ​​différentes actions, ce n'est pas possible. Votre action devra effectuer le changement que vous recherchez. –

56

Actions répondre à la fois et GETs par défaut POSTs, de sorte que vous ne devez pas spécifier quoi que ce soit:

public ActionResult SignIn() 
{ 
    //how'd we get here? 
    string method = HttpContext.Request.HttpMethod; 
    return View(); 
} 

En fonction de votre besoin, vous pouvez toujours effectuer une logique différente en fonction du HttpMethod par exploitation sur la valeur HttpContext.Request.HttpMethod.

+5

c'est bien jusqu'à ce que vous essayez d'utiliser des modèles de vue! Dans l'action post, vous passeriez généralement dans le viewmodel, j'ai essayé d'utiliser un param facultatif et par défaut à null, mais cela ne fonctionne pas. – JBeckton

+1

@JBeckton Habituellement, j'ai une méthode GET qui a simplement des paramètres de chaîne de requête 'SignIn (Guid? UserId)' et POST a un modèle de vue 'SignIn (SomeVM vm)' et appelle une méthode privée partagée 'SignInHandleGetPost (...)' ... qui prend peut-être VM que la méthode GET doit initialiser, ou des paramètres facultatifs, ou ce que vous préférez faire pour refactoriser le code rusable/partagé. – AaronLS

+0

@JBeckton Je viens de l'essayer maintenant avec le projet exemple ASP.NET MVC 4.6.1, avec la méthode 'AccountController.Login (String returnUrl, modèle LoginViewModel)' et cela fonctionne très bien. 'model' est nul sur GET et non-nul sur POST. Toutefois, '[ValidateForgeryToken]' doit être remplacé car 'ValidateForgeryToken' déclenche une exception sur les requêtes GET. – Dai

111

Ceci est possible en utilisant l'attribut AcceptVerbs. C'est un peu plus bavard mais plus flexible.

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] 
public ActionResult SignIn() 
{ 
} 

Plus sur msdn.

+0

Oui, mais que se passe-t-il si la méthode utilise des paramètres (par exemple SignIn (paramètres SingInParams) ... pour GET, ils proviennent d'URI (donc [FromUri] doit être spécifié) et pour POST ils sont pris du corps (donc [FromBody] doit être spécifié)? – jabko87

+0

Cela devrait être la réponse acceptée. –

Questions connexes