2008-11-12 10 views
21

¿Tengo que registrar la restricción HttpVerb en mi definición de ruta (cuando estoy registrando rutas) si ya decoré mi método de acción con el atributo [AcceptVerbs (..)]?ASP.NET MVC AcceptVerbs y registrar rutas

por ejemplo. tengo esto.

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

¿Necesito agregar esto a la ruta que se refiere a esta acción, como una restricción?

Respuesta

33

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.

+0

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

+1

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

+0

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

4

Nope - Create solo responderá a las solicitudes POST.

Puede tener otras implementaciones de Crear con diferentes atributos de AcceptVerb, o uno sin atributo que capture todas las demás solicitudes.

Si ese era el único método Crea, cualquier GET (u otro no-POST) petición resultaría en un 404.

Asumo bajo el capó esto es todo lo que está realizando el motor de enrutamiento de todos modos. [Editar: nope, ver la publicación de Haacked]

+1

Sí - entiendo todo eso, pero esa no es la cuestión. ¿Cuál es la diferencia entre el atributo AcceptVerb frente a la restricción HttpVerb, definida en la definición de ruta? Nada ... ¿De cualquier forma que flote su bote? –

1

Primera decorar así:

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

entonces es necesario agregar ruta así:

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