Eu gostaria que uma única ação respondesse tanto a Gets quanto a Posts. Eu tentei o seguinte
[HttpGet]
[HttpPost]
public ActionResult SignIn()
Isso não pareceu funcionar. Alguma sugestão ?
Eu gostaria que uma única ação respondesse tanto a Gets quanto a Posts. Eu tentei o seguinte
[HttpGet]
[HttpPost]
public ActionResult SignIn()
Isso não pareceu funcionar. Alguma sugestão ?
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]ou [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? Não sei nada sobre esses atributos, mas se você está fazendo o segundo, pode ser por isso que está recebendo esse erro.
Respostas:
Isso é possível usando o atributo AcceptVerbs. É um pouco mais prolixo, mas mais flexível.
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
Mais no msdn .
As ações respondem a GETs e POSTs por padrão, então você não precisa especificar nada:
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
Dependendo da sua necessidade, você ainda pode executar lógicas diferentes dependendo do HttpMethod, operando no valor HttpContext.Request.HttpMethod.
SignIn(Guid? UserId)e POST tem modelo de visão SignIn(SomeVM vm)e ambos chamam um método privado compartilhado SignInHandleGetPost(...)... que pode levar VM que o método GET deve inicializar, ou parâmetros opcionais, ou o que você preferir fazer para refatorar o código reutilizável / compartilhado.
AccountController.Login(String returnUrl, LoginViewModel model)e funciona bem. modelé nulo em GET e não nulo em POST. No entanto, [ValidateForgeryToken]precisa ser substituído porque ValidateForgeryTokenlança uma exceção nas solicitações GET.
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}