2009-04-07 8 views
47

In meinem Controller habe ich zwei Aktionen namens "Friends". Die Ausführung hängt davon ab, ob es sich um ein "Holen" oder ein "Post" handelt.Post und Get mit der gleichen Methode Signatur

So sehen meine Code-Schnipsel etwas wie folgt aus:

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

Dies ist jedoch nicht kompiliert, da ich zwei Methoden mit derselben Signatur (Freunde) haben. Wie gehe ich vor? Muss ich nur eine Aktion erstellen, aber zwischen "Get" und "Post" unterscheiden? Wenn ja, wie mache ich das?

Antwort

106

Benennen Sie die zweite Methode in etwas anderes wie "Friends_Post" um und dann können Sie das Attribut [ActionName("Friends")] zum zweiten hinzufügen. Daher werden die Anfragen an die Friend-Aktion mit POST als Anforderungstyp von dieser Aktion bearbeitet.

+7

seit MVC 2.0 '[AcceptVerbs (HttpVerbs.Get)] 'kann zu' [HttpGet] 'gekürzt werden, das gleiche gilt für andere REST-Methoden – nimrod

2

nicht ganz sicher, ob es der richtige Weg ist, aber ich würde einen sinnlosen Parameter verwenden, um die Sigs zu unterscheiden. wie:

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends(bool isGet) 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

Ich weiß, es hässlich und hackish ist, aber es funktioniert.

2

Marking Cagdas 'Antwort als Antwort, da es meine Frage beantwortet. Da ich jedoch das ActionName-Attribut in meinem Projekt nicht gerne verwende, verwende ich eine andere Lösung. Ich habe einfach die Formcollection in der „post“ action (die die Methodensignatur Wechsel endet)

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(FormCollection form) 
{ 
    // do some stuff 
    return View(); 
} 
+0

Es wäre besser, einen mehr typisierten Ansatz zu verwenden, um die geposteten Elemente zu empfangen - siehe Antwort –

1

die params in der Post erhalten zu wollen, auf die Post-Methode hinzufügen. vielleicht wie folgt aus:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

..oder wenn Sie einen komplexen Typ haben, wie folgt aus:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(Friend friend) 
{ 
    // do some stuff 
    return View(); 
} 

Edit: Es wäre wünschenswert, eine typisierte-Ansatz zur Aufnahme der entsandte zu verwenden Artikel, wie oben.

16

Wenn Sie wirklich nur eine Routine wollen beide Verben zu handhaben, versuchen Sie dies:

[AcceptVerbs("Get", "Post")] 
public ActionResult ActionName(string param1, ...) 
{ 
//Fun stuff goes here. 
} 

Eine mögliche Einschränkung: Ich verwende Release MVC 2. Nicht sicher, ob dies in MVC 1. Die Intellisense unterstützt wurde Dokumentation für AcceptVerbs sollte es Ihnen wissen lassen.

+3

[AcceptVerbs (" Get "," Post ")] sollte funktionieren, da sein Konstruktor als AcceptVerbsAttribute (params string [] Verben) definiert ist. Sieht aufgeräumter aus. – jamiebarrow

+0

Danke! Ich mag das besser. – mohrtan

0

Ihre Aktionsmethoden können nicht dasselbe tun, da sonst keine zwei Aktionsmethoden geschrieben werden müssten. Wenn also die Semantik anders ist, warum nicht auch andere Namen für die Aktionsmethoden verwenden?

Wenn Sie zum Beispiel eine "Delete" -Aktionsmethode hatten und GET nur nach Bestätigung fragt, könnten Sie die GET-Methode "ConfirmDelete" aufrufen und die POST-Methode einfach "Delete".

Nicht sicher, ob das zu Ihrem Szenario passt, aber es hat immer für mich getan, wenn ich das gleiche Problem hatte.

4

Versuchen Sie es mit:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 
Verwandte Themen