2010-03-12 12 views
9

tôi đã hơi ngạc nhiên một vài phút trước khi tôi cố gắng quá tải một hành động trong một trong những bộ điều khiển của tôiquá tải điều khiển Actions

tôi đã

public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

tôi thêm

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 

. ... và đột nhiên cả hai đều không hoạt động

Tôi đã khắc phục sự cố bằng cách đặt 'id' không có giá trị và loại bỏ của hai phương pháp khác

public ActionResult Get(int? id) 
{ 
    if (id.HasValue) 
     return PartialView(/*return 1 thing*/); 
    else 
     return PartialView(/*return everything*/); 
} 

và nó hoạt động, nhưng mã của tôi có chút xấu xí!

Mọi nhận xét hoặc đề xuất? Tôi có phải sống với nhược điểm này trên Bộ điều khiển của mình không?

Cảm ơn

Dave

Trả lời

4

Bạn không thể quá tải hoạt động theo cách này khi bạn đã phát hiện ra.

Cách duy nhất để có nhiều hành động có cùng tên là nếu chúng phản ứng với các động từ khác nhau.

Tôi cho rằng có một phương pháp xử lý cả hai tình huống là giải pháp sạch hơn và cho phép bạn đóng gói logic của mình ở một nơi và không dựa vào việc biết nhiều phương pháp có cùng tên được sử dụng cho các mục đích khác nhau . - Tất nhiên đây là chủ quan và chỉ là ý kiến ​​của tôi.

Nếu bạn thực sự muốn có các phương pháp riêng biệt, bạn có thể đặt tên cho chúng khác nhau để chúng thể hiện rõ mục đích khác nhau của chúng. ví dụ:

public ActionResult GetAll() 
{ 
    return PartialView(/*return all things*/); 
} 

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 
+0

@Matt, điểm tốt. Nó phải là GetAll(). – DaveDev

1

Theo tôi, điều đó thực sự có ý nghĩa khi bạn nói Dave. Ví dụ, nếu tôi có một lựa chọn có tùy chọn lựa chọn mọi thứ, hoặc một bản ghi duy nhất, tôi không muốn các phương thức khác nhau cho điều đó, mà đúng hơn là có một phương thức với quá tải như một phương thức Dave đang hiển thị trong ví dụ.

// MrW

0

Tôi không thấy câu trả lời đúng ở đây, Vì vậy, tôi muốn đăng câu trả lời đúng.

Có, bạn có thể quá tải kết quả hành động trong MVC bằng cách sử dụng thuộc tính ActionName.

[ActionName("Get")] 
public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

[ActionName("GetById")] 
public ActionResult Get(int? id) 
{ 
    //code 
}