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 ValidateForgeryToken
lança uma exceção nas solicitações GET.
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}