Chciałbym, aby jedna akcja odpowiadała zarówno na Gets, jak i Posty. Wypróbowałem następujące
[HttpGet]
[HttpPost]
public ActionResult SignIn()
To nie wydawało się działać. Jakieś sugestie ?
Chciałbym, aby jedna akcja odpowiadała zarówno na Gets, jak i Posty. Wypróbowałem następujące
[HttpGet]
[HttpPost]
public ActionResult SignIn()
To nie wydawało się działać. Jakieś sugestie ?
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
czy [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
? Nie wiem nic o tych atrybutach, ale jeśli robisz drugie, może to być przyczyną tego błędu.
Odpowiedzi:
Jest to możliwe przy użyciu atrybutu AcceptVerbs. Jest trochę bardziej rozwlekły, ale bardziej elastyczny.
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
Więcej o msdn .
Akcje domyślnie odpowiadają zarówno na GET, jak i POST, więc nie musisz niczego określać:
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
W zależności od potrzeb można nadal wykonywać inną logikę w zależności od HttpMethod, działając na wartości HttpContext.Request.HttpMethod.
SignIn(Guid? UserId)
a POST ma model widoku SignIn(SomeVM vm)
i oba wywołują udostępnioną metodę prywatną SignInHandleGetPost(...)
... która może pobierać maszynę wirtualną, którą musi zainicjować metoda GET, lub opcjonalne parametry, lub cokolwiek wolisz do refaktoryzacji kodu, który można wykorzystać / udostępnić.
AccountController.Login(String returnUrl, LoginViewModel model)
i działa dobrze. model
ma wartość null w przypadku GET i niezerową w przypadku POST. Jednak [ValidateForgeryToken]
musi zostać zastąpiony, ponieważ ValidateForgeryToken
zgłasza wyjątek w żądaniach GET.
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}