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. modelma wartość null w przypadku GET i niezerową w przypadku POST. Jednak [ValidateForgeryToken]musi zostać zastąpiony, ponieważ ValidateForgeryTokenzgłasza wyjątek w żądaniach GET.
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}