2010-07-12 15 views
75

Ich möchte eine einzige Aktion sowohl auf Gets als auch auf Posts reagieren. Ich habe folgendes versuchtGET und POST zu gleichen Controller-Aktion in ASP.NET MVC

[HttpGet] 
[HttpPost] 
public ActionResult SignIn() 

Das schien nicht zu funktionieren. Irgendwelche Vorschläge ?

+0

Was funktioniert nicht, und wie schlägt es fehl? –

+0

Um das Problem zu erklären: Die Aktion wird ignoriert. Jedes Attribut wird alle anderen Anforderungsmethoden ausschließen, sodass die Aktion keine Anforderungsmethoden akzeptiert. – Guffa

+4

Warum wurde EvilRyrys Antwort nicht akzeptiert? Es hat den Trick für mich getan. –

Antwort

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

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

Das ist nicht was ich suche, das ist die Standard-MVC-Implementierung von separaten Methoden für GET und POST über Funktionsüberladung. Ich bin nicht neu in MVC, ich versuche, die GET-Aktion auch auf bestimmte POST-Ereignisse zusätzlich zu der Standard-POST-Aktion für die Formularsammlung zu reagieren. – Cranialsurge

+0

Dann müssen Sie Kurts 'Antwort folgen. Kein Attribut wird beide behandeln. Wenn Sie versuchen, POST-Anfragen zu verschiedenen Aktionen zu senden, ist das nicht möglich. Ihre Aktion muss die von Ihnen gewünschte Suche durchführen. –

56

Aktionen reagieren auf beiden GETs und Beiträge von Standard, so müssen Sie etwas nicht angeben:

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

nach Bedarf Je Sie noch andere Logik in Abhängigkeit von der Httpmethod von Betrieb führen könnten auf dem HttpContext.Request.HttpMethod Wert.

+5

das ist in Ordnung, bis Sie versuchen, Modelle zu verwenden! in der post-aktion würden sie normalerweise das viewmodel übergeben, ich habe versucht, einen optionalen param zu verwenden und default auf null, aber das funktioniert nicht. – JBeckton

+1

@JBeckton Normalerweise habe ich eine GET-Methode, die nur Abfragezeichenfolge params 'SignIn (Guid? UserId)' hat und POST View-Modell 'SignIn (SomeVM vm)' und beide rufen eine gemeinsame private Methode 'SignInHandleGetPost (...)' ... die VM, die die GET-Methode initialisieren muss, oder optionale Parameter oder was immer Sie tun möchten, um den ruseable/shared Code zu refactoring. – AaronLS

+0

@JBeckton Ich habe es gerade mit dem ASP.NET MVC 4.6.1 Beispielprojekt versucht, mit der Methode 'AccountController.Login (String returnUrl, Model LoginViewModel)' und es funktioniert gut. 'Modell' ist bei GET null und bei POST nicht null. Allerdings muss '[ValidateForgeryToken]' überschrieben werden, da 'ValidateForgeryToken' eine Ausnahme für GET-Anfragen auslöst. – Dai

111

Dies ist mit dem AcceptVerbs-Attribut möglich. Es ist etwas ausführlicher, aber flexibler.

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

Mehr auf msdn.

+0

Ja, aber was ist, wenn die Methode Parameter verwendet (zB SignIn (SingInParams Parameter) ... für GET, sie werden von URI genommen (also [FromUri] muss angegeben werden) und für POST werden sie aus dem Körper genommen (so [FromBody] muss angegeben werden)? – jabko87

+0

Dies sollte die akzeptierte Antwort sein. –