Tôi muốn có một hành động duy nhất phản hồi cho cả Gets cũng như Post. Tôi đã thử cái sau
[HttpGet]
[HttpPost]
public ActionResult SignIn()
Điều đó dường như không hoạt động. Bất kỳ đề xuất ?
Tôi muốn có một hành động duy nhất phản hồi cho cả Gets cũng như Post. Tôi đã thử cái sau
[HttpGet]
[HttpPost]
public ActionResult SignIn()
Điều đó dường như không hoạt động. Bất kỳ đề xuất ?
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
hay [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
? Tôi không biết bất cứ điều gì về những thuộc tính đó nhưng nếu bạn đang làm điều thứ hai, đó có thể là lý do tại sao bạn gặp lỗi đó.
Câu trả lời:
Điều này có thể thực hiện được bằng cách sử dụng thuộc tính AcceptVerbs. Nó dài dòng hơn một chút nhưng linh hoạt hơn.
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
Thêm trên msdn .
Theo mặc định, các hành động phản hồi với cả GET và POST, vì vậy bạn không phải chỉ định bất kỳ điều gì:
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
Tùy thuộc vào nhu cầu của bạn, bạn vẫn có thể thực hiện các logic khác nhau tùy thuộc vào HttpMethod bằng cách hoạt động trên giá trị HttpContext.Request.HttpMethod.
SignIn(Guid? UserId)
và POST có xem mô hình SignIn(SomeVM vm)
và cả hai cuộc gọi một phương pháp cá nhân chia sẻ SignInHandleGetPost(...)
... mà có lẽ phải mất VM rằng phương thức GET phải khởi tạo, hoặc params tùy chọn, hoặc bất cứ điều gì bạn muốn làm để cấu trúc lại mã có thể sử dụng / chia sẻ.
AccountController.Login(String returnUrl, LoginViewModel model)
và nó hoạt động tốt. model
là null trên GET và không rỗng trên POST. Tuy nhiên [ValidateForgeryToken]
cần phải được ghi đè vì ValidateForgeryToken
ném một ngoại lệ trên các yêu cầu GET.
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}