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.
@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? –
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
@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? –