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 ?
asp.net-mvc
asp.net-mvc-2
Surto craniano
fonte
fonte
[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.
Mais no msdn .
fonte
As ações respondem a GETs e POSTs por padrão, então você não precisa especificar nada:
Dependendo da sua necessidade, você ainda pode executar lógicas diferentes dependendo do HttpMethod, operando no valor HttpContext.Request.HttpMethod.
fonte
SignIn(Guid? UserId)
e POST tem modelo de visãoSignIn(SomeVM vm)
e ambos chamam um método privado compartilhadoSignInHandleGetPost(...)
... 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 porqueValidateForgeryToken
lança uma exceção nas solicitações GET.fonte