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 ?
asp.net-mvc
asp.net-mvc-2
Cranialsurge
źródło
źródło
[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 .
źródło
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.
źródło
SignIn(Guid? UserId)
a POST ma model widokuSignIn(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) { }
źródło