NHẬN và ĐĂNG lên cùng một Hành động điều khiển trong ASP.NET MVC


91

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 ?


2
Để giải thích vấn đề: Hành động bị bỏ qua. Mỗi thuộc tính sẽ loại trừ tất cả các phương thức yêu cầu khác, vì vậy, hành động sẽ không chấp nhận bất kỳ phương thức yêu cầu nào.
Guffa

Trong ASP.NET MVC2 và VisualStudio 2010, ví dụ của OP (với "[AcceptVerbs (HttpVerbs.Get)]", v.v.) đưa ra lỗi biên dịch: "Duplicate 'AcceptVerbs' thuộc tính".
DaveD

4
@Dave Bạn đang làm [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 đó.
Jared

Câu trả lời:


134

Đ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 .


3
Có, nhưng điều gì sẽ xảy ra nếu phương thức sử dụng các tham số (ví dụ: SignIn (tham số SingInParams) ... cho GET, chúng được lấy từ URI (vì vậy [FromUri] phải được chỉ định) và cho POST chúng được lấy từ body (vì vậy [ FromBody] phải được quy định)?
michal.jakubeczy

64

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.


5
điều này là tốt cho đến khi bạn cố gắng sử dụng các mô hình xem! trong hành động đăng mà bạn thường chuyển trong mô hình xem, tôi đã thử sử dụng một tham số tùy chọn và mặc định nó thành null nhưng điều đó không hoạt động.
JBeckton

1
@JBeckton Thông thường tôi có một phương pháp GET rằng chỉ có truy vấn params string 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ẻ.
AaronLS

2
@JBeckton Bây giờ tôi vừa thử nó với dự án mẫu ASP.NET MVC 4.6.1, với phương pháp AccountController.Login(String returnUrl, LoginViewModel model)và nó hoạt động tốt. modellà null trên GET và không rỗng trên POST. Tuy nhiên [ValidateForgeryToken]cần phải được ghi đè vì ValidateForgeryTokenném một ngoại lệ trên các yêu cầu GET.
Đại

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

Đó không phải là những gì tôi đang tìm kiếm, đó là triển khai MVC mặc định có các phương thức riêng biệt cho GET và POST thông qua nạp chồng hàm. Tôi không phải là người mới đối với MVC, tôi đang cố gắng để hành động GET cũng phản hồi các sự kiện POST nhất định ngoài hành động POST tiêu chuẩn cho bộ sưu tập biểu mẫu.
Cranialsurge vào

Sau đó, bạn cần phải làm theo câu trả lời của Kurts. Không có thuộc tính nào sẽ xử lý cả hai. Nếu bạn đang cố yêu cầu POST thực hiện các hành động khác nhau, điều đó là không thể. Hành động của bạn sẽ phải thực hiện chuyển đổi mà bạn đang tìm kiếm.
Jeremy B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.