2008-11-12 16 views
21

Muss ich die HttpVerb-Einschränkung in meiner Routendefinition registrieren (wenn ich Routen registriere), wenn ich meine Aktionsmethode bereits mit dem Attribut [AcceptVerbs (..)] versehen habe?ASP.NET MVC AcceptVerbs und Registrierung von Routen

z. ich habe das.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) 
{ .. } 

Muss ich die Route, die sich auf diese Aktion bezieht, als Einschränkung hinzufügen?

Antwort

33

Der Unterschied zwischen den beiden ist folgender: Nehmen wir an, die Create Methode in Frage ist auf der HomeController.

Das Attribut AcceptVerbs wirkt sich nicht auf das Routing aus. Es ist tatsächlich etwas, das von der Aktion Invoker verwendet wird. Sie können also zwei Aktionsmethoden auf einem Controller mit demselben Namen ausführen, die jeweils auf eine andere HTTP-Methode reagieren.

public ActionResult Create(int id) { .. } 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) { .. } 

Also, wenn ein Antrag auf /home/create kommt, wird die Route anzeigen lassen und die Anforderung an den Aufrufer des Controllers Hand ab. Der Aufrufer ruft dann die richtige Methode auf, indem er das Attribut AcceptVerbs betrachtet.

Die Verwendung der HttpMethodConstraint im Routing wird es so machen, dass die Route selbst nicht mit der Anfrage übereinstimmt. Wenn also eine POST-Anfrage für /home/create eingeht, wird keine der beiden Methoden aufgerufen, da diese Route nicht mit der Anfrage übereinstimmt. Es ist möglich, dass eine andere Route wird diese Anfrage obwohl übereinstimmen.

Teil der Grund für die Überschneidung hier ist, dass Routing eine Funktion von ASP.NET 3.5 SP1 ist und nicht für MVC spezifisch ist. MVC verwendet Routing, aber Routing wird auch von dynamischen Daten verwendet, und wir planen, das Routing mit ASP.NET Web Forms zu integrieren.

+0

@Phil: Ich verstehe den ersten Teil darüber, wie der Aufrufer des Controllers die beste Methode basierend auf AcceptVerbs wählt. Ich verstehe den zweiten Teil nicht. Wollen Sie sagen, dass Sie, wenn Sie die HttpMethodConstraint verwenden, nicht wissen, welche Create-Methode verwendet werden soll? –

+1

Nein, ich sage, dass die Verwendung einer Einschränkung bedeutet, dass die Route selbst nicht übereinstimmt. Wenn keine Route übereinstimmt, wird die Anfrage nicht an MVC übergeben. – Haacked

+0

@Haacked - Dieser Beitrag ist sehr alt, aber ich habe eine Frage bezüglich dieser beiden Techniken. Ich benutze MVC3 und versuche, eine JSON API für meine App in einer RESTful Weise zu erstellen. Dies bedeutet, dass ich eine einzige Route habe, die 3 Verben behandeln muss (POST, PUT, DELETE) - wäre es schlauer, eine Beschränkung auf der Routing-Ebene zu verwenden und einfach 3 separate Aktionen in den Routen einzubauen ... oder besser zu bauen ein Attribut im MVC-Framework, das mehrere Verben erfasst und sie als Argument an die Aktion übergibt? –

4

Nein - Create reagiert nur auf POST-Anfragen.

Sie können andere Implementierungen von Create mit verschiedenen AcceptVerb-Attributen verwenden, oder eine mit keinem Attribut, das alle anderen Anforderungen abfängt.

Wenn das Ihre einzige Methode erstellen ist, jede GET (oder andere Nicht-POST) Anforderung in einem 404.

würde ich unter der Haube nehme an, dies ist alles sowieso durch das Routing-Engine durchgeführt wird. [edit: nein, siehe Haackeds Beitrag]

+1

Yep - ich alles verstehen, aber das ist nicht die Frage. Was ist der Unterschied zwischen dem AcceptVerb-Attribut und der HttpVerb-Einschränkung, die in der Routendefinition definiert sind? Nichts ... wie auch immer dein Boot schwimmt? –

1

Zuerst wie folgt dekorieren:

[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)] 
public virtual object ItemSave(Menu sampleInput) 

dann müssen Sie Route wie folgt hinzuzufügen:

AddRoute(
       "SampleEdit", 
       "Admin/{sampleID}/Edit", 
       new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true }, 
       new { areaID = new IsGuid() }, 
       new { Namespaces = controllerNamespaces } 
      ); 
Verwandte Themen