Me gustaría tener una sola acción que responda tanto a Gets como a Posts. Intenté lo siguiente
[HttpGet]
[HttpPost]
public ActionResult SignIn()
Eso no pareció funcionar. Alguna sugerencia ?
asp.net-mvc
asp.net-mvc-2
Cranialsurge
fuente
fuente
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
o[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
? No sé nada sobre esos atributos, pero si está haciendo el segundo, puede que sea por eso que está obteniendo ese error.Respuestas:
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 .
fuente
Las acciones responden tanto a GET como a 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(); }
Dependiendo de su necesidad, aún puede realizar una lógica diferente según el HttpMethod operando en el valor HttpContext.Request.HttpMethod.
fuente
SignIn(Guid? UserId)
y POST tiene un modelo de vistaSignIn(SomeVM vm)
y ambos llaman a un método privado compartidoSignInHandleGetPost(...)
... que tal vez tome una VM que el método GET debe inicializar, o parámetros opcionales, o lo que prefiera hacer para refactorizar el código reutilizable / compartido.AccountController.Login(String returnUrl, LoginViewModel model)
y funciona bien.model
es nulo en GET y no nulo en POST. Sin embargo[ValidateForgeryToken]
, debe anularse porqueValidateForgeryToken
genera una excepción en las solicitudes GET.[HttpGet] public ActionResult SignIn() { } [HttpPost] public ActionResult SignIn(FormCollection form) { }
fuente