2009-04-07 33 views
47

Trong bộ điều khiển của tôi, tôi có hai hành động được gọi là "Bạn bè". Việc thực hiện phụ thuộc vào việc đó có phải là "nhận" so với "bài đăng" hay không.đăng và nhận cùng với chữ ký phương thức

Vì vậy, đoạn mã của tôi trông giống như thế này:

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

Tuy nhiên, điều này không biên dịch kể từ khi tôi có hai phương pháp với cùng một chữ ký (bạn bè). Làm thế nào để tôi tạo ra điều này? Tôi có cần phải tạo ra một hành động nhưng phân biệt giữa một "get" và "post" bên trong nó không? Nếu vậy, làm thế nào để tôi làm điều đó?

Trả lời

106

Đổi tên phương thức thứ hai thành phương thức khác như "Friends_Post" và sau đó bạn có thể thêm thuộc tính [ActionName("Friends")] vào thuộc tính thứ hai. Vì vậy, các yêu cầu đối với hành động Bạn bè với POST là loại yêu cầu, sẽ được xử lý bởi hành động đó.

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[ActionName("Friends")] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends_Post() 
{ 
    // do some stuff 
    return View(); 
} 
+7

từ MVC 2,0 '[AcceptVerbs (HttpVerbs.Get)] 'có thể được rút ngắn thành' [HttpGet] ', tương tự với các phương thức REST khác – nimrod

2

không hoàn toàn chắc chắn nếu đó là cách chính xác, nhưng tôi sẽ sử dụng thông số vô nghĩa để phân biệt các sigs. như:

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends(bool isGet) 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

Tôi biết nó xấu xí và hackish, nhưng nó hoạt động.

2

Đánh dấu phản hồi của cagdas là câu trả lời vì câu trả lời đã trả lời được câu hỏi của tôi. Tuy nhiên, vì tôi không thích sử dụng thuộc tính ActionName trong dự án của mình nên tôi sử dụng một giải pháp khác. Tôi chỉ đơn giản là thêm FormCollection đến hành động "bài" (mà kết thúc việc thay đổi phương pháp chữ ký)

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(FormCollection form) 
{ 
    // do some stuff 
    return View(); 
} 
+0

Sẽ thích hợp hơn khi sử dụng cách tiếp cận được đánh máy hơn để nhận các mục đã đăng - xem câu trả lời –

1

thêm vào phương pháp Post params muốn nhận trong bài viết. có lẽ như thế này:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

..or nếu bạn có một loại phức tạp, như thế này:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(Friend friend) 
{ 
    // do some stuff 
    return View(); 
} 

Edit: Nó sẽ là thích hợp hơn để sử dụng một cách tiếp cận nhiều hơn gõ-nhận được sự posted các mục, như trên.

16

Nếu bạn thực sự chỉ muốn một thói quen để xử lý cả hai động từ, hãy thử này:

[AcceptVerbs("Get", "Post")] 
public ActionResult ActionName(string param1, ...) 
{ 
//Fun stuff goes here. 
} 

Một caveat tiềm năng: Tôi đang sử dụng MVC phát hành 2. Không chắc nếu điều này được hỗ trợ trong MVC 1. Intellisense tài liệu cho AcceptVerbs sẽ cho bạn biết.

+3

[AcceptVerbs (" Get "," Post ")] nên làm việc vì constructor của nó được định nghĩa là AcceptVerbsAttribute (params string [] động từ). Trông tidier. – jamiebarrow

+0

Cảm ơn! Tôi thích điều đó tốt hơn. – mohrtan

0

Phương pháp hành động của bạn không thể thực hiện tương tự, nếu không sẽ không cần viết hai phương thức hành động. Vì vậy, nếu ngữ nghĩa là khác nhau, tại sao không sử dụng tên khác nhau cho các phương pháp hành động là tốt?

Ví dụ: nếu bạn có phương thức hành động "xóa" và GET chỉ yêu cầu xác nhận, bạn có thể gọi phương thức GET "ConfirmDelete" và phương thức POST chỉ "Xóa".

Không chắc chắn điều đó có phù hợp với kịch bản của bạn hay không, nhưng nó luôn làm cho tôi khi tôi gặp vấn đề tương tự.

4

Hãy thử sử dụng:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 
Các vấn đề liên quan