La diferencia entre los dos es la siguiente: Supongamos que el método Create
en cuestión está en el HomeController
.
El uso del atributo AcceptVerbs
no afecta al enrutamiento. En realidad, es algo utilizado por el invocador de acción. Lo que le permite hacer es tener 2 métodos de acción en un controlador con el mismo nombre que responden a un Método HTTP diferente.
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
Por eso, cuando una solicitud de /home/create
entra, la ruta coincidirá y de la mano de la solicitud de invocador del controlador. El invocador invoca el método correcto mirando el atributo AcceptVerbs
.
El uso del HttpMethodConstraint
en el enrutamiento hará que la ruta en sí no coincida con la solicitud. Entonces cuando una solicitud POST ingresa por /home/create
, no se llamará a ningún método de acción porque esa ruta no coincidirá con la solicitud. Es posible que otra ruta corresponda a.
Parte del motivo de la superposición aquí es que el enrutamiento es una característica de ASP.NET 3.5 SP1 y no es específico de MVC. MVC utiliza enrutamiento, pero el enrutamiento también lo utilizan Dynamic Data y planeamos integrar el enrutamiento con ASP.NET Web Forms.
@Phil: entiendo la primera parte sobre cómo el invocador del controlador elige el mejor método, basado en AcceptVerbs. No entiendo la segunda parte. ¿Estás diciendo que si usas HttpMethodConstraint, no sabría qué método Create usar? –
No, estoy diciendo que usar una restricción significa que la ruta en sí no coincide. Si ninguna ruta coincide, entonces la solicitud no se transfiere a MVC en primer lugar. – Haacked
@Haacked - Esta publicación tiene muchas eras, pero tengo una pregunta sobre estas dos técnicas. Estoy usando MVC3 y estoy intentando construir una API api para mi aplicación de manera RESTful. Esto significa que tengo una ruta única que necesita manejar 3 verbos (POST, PUT, DELETE) - ¿Sería más inteligente usar una restricción en el nivel de enrutamiento y simplemente tener 3 acciones separadas conectadas en las rutas ... o mejor para construir un atributo en el marco MVC que captura verbos múltiples y los pasa como un argumento para la acción? –