Pregunta

¿tengo que registrar la restricción HttpVerb en mi definición de ruta (cuando estoy registrando rutas) si ya he decorado mi método de acción con el atributo [AcceptVerbs (..)]?

ej. 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?

¿Fue útil?

Solución

La diferencia entre los dos es la siguiente: Supongamos que el método Crear en cuestión está en el HomeController .

El uso del atributo AcceptVerbs no afecta el enrutamiento. En realidad es algo usado 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) { .. }

Entonces, cuando llega una solicitud de / home / create , la ruta coincidirá y entregará la solicitud al invocador del controlador. El invocador invoca el método correcto mirando el atributo AcceptVerbs .

El uso de HttpMethodConstraint en el enrutamiento hará que la ruta en sí misma no coincida con la solicitud. Entonces, cuando llega una solicitud POST para / home / create , no se llamará a ningún método de acción porque esa ruta no coincidirá con la solicitud. Sin embargo, es posible que otra ruta coincida con esa solicitud.

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 usa el enrutamiento, pero el enrutamiento también lo usan los datos dinámicos y planeamos integrar el enrutamiento con los formularios web ASP.NET.

Otros consejos

No: crear solo responderá a las solicitudes POST.

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

Si ese fuera su único método Create, cualquier solicitud GET (u otra solicitud que no sea POST) generaría un 404.

Asumo debajo del capó, todo esto lo está haciendo el motor de enrutamiento de todos modos. [edit: no, mira la publicación de Haacked]

Primero decora así:

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

entonces necesita agregar una ruta como esta:

 AddRoute(
                "SampleEdit",
                "Admin/{sampleID}/Edit",
                new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
                new { areaID = new IsGuid() },
                new { Namespaces = controllerNamespaces }
           );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top