2009-07-17 26 views
13

Tất cả các ví dụ tôi đã nhìn thấy cho quá tải thường chỉ có hai phương thức cùng tên với các tham số khác nhau và một phương thức sử dụng động từ GET trong khi các ví dụ khác sử dụng POST. Có thể thực hiện hai hoặc nhiều quá tải trên cùng một phương pháp, tất cả đều có cùng động từ không?Quá tải các phương pháp điều khiển asp.net MVC với cùng động từ?

Dưới đây là một ví dụ về những gì tôi đang đề cập đến: Can you overload controller methods in ASP.NET MVC?

Trả lời

8

Tôi không nghĩ rằng bạn có thể quá tải cùng tên hành động với một động từ theo mặc định. Như là chủ đề khác bạn chỉ ra để nói, bạn có thể quá tải các phương pháp & sau đó sử dụng một thuộc tính để thay đổi hành động ánh xạ tới phương pháp, nhưng tôi đoán đó không phải là những gì bạn đang tìm kiếm.

Một tùy chọn khác mà tôi đã sử dụng trước đây (phụ thuộc vào mức độ phức tạp/khác nhau của quá tải) chỉ đơn giản là sử dụng các giá trị nullable cho các tham số &. Vì vậy, thay vì:

public ActionResult DoSomething(int id)... 
public ActionResult DoSomething(string name)... 

chỉ có:

public ActionResult DoSomething(int? id, string? name) 

Không phải là giải pháp đẹp nhất, nhưng nếu một trong tình trạng quá tải chỉ được xây dựng trên một sau đó nó không phải là quá xấu một thỏa hiệp.

Một tùy chọn cuối cùng có thể đáng để đi (tôi chưa thử nó & thậm chí không biết nếu nó hoạt động, nhưng về mặt logic nó nên), là viết thực hiện ActionMethodSelectorAttribute so sánh các tham số được truyền trong ControllerContext đến phương thức chữ ký & cố gắng tạo ra một kết quả phù hợp nhất (tức là cố gắng giải quyết sự mơ hồ hơn một chút so với việc thực thi mặc định).

+0

Điều này là khá nhiều những gì tôi làm, nhưng tôi viết nó là công cộng ActionResult DoSomething (int? Id, tên chuỗi) và chỉ cần kiểm tra String.IsNullOrEmpthy (tên) trong phương thức. – Chris

0

Tôi đoán là không. Kể từ khi tôi phát hiện ra rằng khung MVC đã không thực sự quan tâm những gì bạn đặt trong danh sách tham số, ví dụ, hành động của tôi cũng giống như:

public ActionResult Index(int id) {...} 

Nó là ok để yêu cầu như thế này: Domain.com/Index.aspx hoặc Domain.com/Index.aspx?id=012901 hoặc thậm chí Domain.com/Index.aspx?login=938293

Kể từ khi quá tải trong ngôn ngữ lập trình có nghĩa là bạn chọn chức năng khác nhau (cùng tên) sử dụng đầu vào các thông số, nhưng MVC trong trường hợp này không quan tâm đến nó! Vì vậy, khác hơn là quá tải ActionVerb, tôi nghĩ rằng nó không phải là ok.

+0

Có nhưng tôi tin rằng đó là vì cú pháp URL của bạn, khi tôi đang sử dụng cú pháp kiểu {controller}/{action}/{id}. – 4thSpace

+0

Tôi đã không thử cú pháp như của bạn để kiểm tra quá tải, nhưng có vẻ như vẫn chưa thực hiện được vì ASP.net MVC sẽ vẫn xử lý id (tham số) dưới dạng chuỗi và chuyển nó tới hành động (có thể thử định kiểu nó nếu hành động chỉ chấp nhận int, nhưng trong trường hợp đó, một số lỗi có thể tăng lên khi id không phải là số nguyên) – xandy

Các vấn đề liên quan