2010-07-12 15 views
75

Me gustaría que una sola acción responda tanto a las Entradas como a las Entradas. Intenté lo siguienteGET y POST a la misma Acción del controlador en ASP.NET MVC

[HttpGet] 
[HttpPost] 
public ActionResult SignIn() 

Eso no parecía funcionar. Alguna sugerencia ?

+0

¿Qué no funciona y cómo falla? –

+0

Para explicar el problema: la acción se ignora. Cada atributo excluirá todos los otros métodos de solicitud, por lo que la acción termina no aceptando ningún método de solicitud. – Guffa

+4

¿Por qué no se aceptó la respuesta de EvilRyry? Me hizo el truco. –

Respuesta

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

[HttpPost] 
public ActionResult SignIn(FormCollection form) 
{ 
} 
+0

Eso no es lo que estoy buscando, esa es la implementación MVC predeterminada de tener métodos separados para GET y POST a través de la sobrecarga de funciones. No soy nuevo en MVC, estoy intentando que la acción GET también responda a ciertos eventos POST además de la acción POST estándar para la colección de formularios. – Cranialsurge

+0

Luego debes seguir la respuesta de Kurts. Ningún atributo se encargará de ambos. Si intenta que las solicitudes POST vayan a diferentes acciones, eso no es posible. Tu acción tendrá que realizar el cambio que estás buscando. –

56

responder a acciones tanto GET y POST de forma predeterminada, por lo que no tiene que especificar nada:

public ActionResult SignIn() 
{ 
    //how'd we get here? 
    string method = HttpContext.Request.HttpMethod; 
    return View(); 
} 

En función de la necesidad que aún se podía realizar la lógica diferente dependiendo de la HTTPMethod por operativo en el valor HttpContext.Request.HttpMethod.

+5

¡esto está bien hasta que intente utilizar modelos de vista! en la acción de publicación normalmente pasaría en el modelo de vista, he intentado usar un parámetro opcional y predeterminado para anular pero eso no funciona. – JBeckton

+1

@JBeckton Normalmente tengo un método GET que solo tiene los parámetros de cadena de consulta 'SignIn (Guid? UserId)' y POST tiene el modelo de vista 'SignIn (SomeVM vm)' y ambos llaman a un método privado compartido 'SignInHandleGetPost (...)' ... que tal vez requiera VM que el método GET debe inicializar, o params opcionales, o lo que sea que prefiera para la refacturación del código ruseable/shared. – AaronLS

+0

@JBeckton Acabo de probarlo ahora con el proyecto de ejemplo ASP.NET MVC 4.6.1, con el método 'AccountController.Login (String returnUrl, modelo LoginViewModel)' y funciona bien. 'model' es nulo en GET y no nulo en POST. Sin embargo, '[ValidateForgeryToken]' debe sustituirse porque 'ValidateForgeryToken' arroja una excepción en las solicitudes GET. – Dai

111

Esto es posible utilizando el atributo AcceptVerbs. Es un poco más detallado pero más flexible.

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] 
public ActionResult SignIn() 
{ 
} 

Más sobre msdn.

+0

Sí, pero si el método usa parámetros (por ejemplo, SignIn (parámetros de SingInParams) ... para GET, están tomados de URI (por lo que [DeUri] tiene que especificarse) y para POST están tomados del cuerpo (por lo tanto [FromBody] tiene que ser especificado)? – jabko87

+0

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas