2013-02-20 21 views
5

Tôi đang điều chỉnh dự án nguồn mở (NopCommerce). Nó là một phần mềm tuyệt vời và hỗ trợ khả năng mở rộng bằng cách sử dụng các plugin. Đối với một plugin, tôi muốn thêm thông tin vào một khung nhìn, để làm điều đó, tôi muốn kế thừa từ Controller và ghi đè lên các hành động mà tôi cần phải thay đổi. Vì vậy, đây là bộ điều khiển của tôi:Có cách nào để ghi đè lên một hành động điều khiển MVC?

public class MyController : OldController{ 
//stuff 

public new ActionResult Product(int productId) 
{ 
//Somestuff 
} 

} 

tôi đã thay đổi con đường từ plugin của tôi, nhưng khi hành động này được gọi là tôi nhận được lỗi sau:

The current request for action 'Product' on controller type 'MyController' is ambiguous between the following action methods: System.Web.Mvc.ActionResult Product(Int32) on type MyPlugin System.Web.Mvc.ActionResult Product(Int32) on type OldController

Có cách nào tôi có thể ghi đè phương pháp này ? (Ps: Tôi không thể sử dụng từ khóa override bởi vì nó không được đánh dấu là ảo, trừu tượng hoặc ghi đè trong OldController)

cảm ơn, Oscar

+1

Làm thế nào về việc không _deriving_ từ 'OldController' nhưng thay vì cung cấp tất cả các 'OldController' phương pháp bọc trong' bạn lớp MyController' (loại tương tự như [mô hình Proxy] (http://www.dofactory.com /Patterns/PatternProxy.aspx#_self1)) –

+0

Nếu nó được đánh dấu là ảo thì nó có hoạt động không? Tôi đã suy nghĩ một cách sai lầm rằng những gì bạn đã có thể đã làm việc – Rikon

+0

những gì bạn muốn đạt được mà không phải là dễ dàng mở rộng từ lớp điều khiển hiện tại? –

Trả lời

6

Nếu phương pháp OldController là số ít, redeclare như thế này.

public class MyController : Controller 
{ 
    private OldController old = new OldController(); 

    // OldController method we want to "override" 
    public ActionResult Product(int productid) 
    { 
     ... 
     return View(...); 
    } 

    // Other OldController method for which we want the "inherited" behavior 
    public ActionResult Method1(...) 
    { 
     return old.Method1(...); 
    } 
} 
+1

Vâng, đây là một cách mà âm thanh tốt, @Uwe Kleim đề xuất nó trong các ý kiến. DaveA âm thanh khi anh ta có một cái nhìn rất tốt, vì vậy tôi sẽ kiểm tra ý tưởng của anh ấy trước khi thử cái này :) – JSBach

+1

@Oscar, tùy thuộc vào nhu cầu của bạn, tôi đã gợi ý kế thừa từ lớp Controller chính xác theo cách của ebattulga. Đây là phương pháp bạn đang tìm kiếm! ;) –

+1

@DaveA Cảm ơn rất nhiều! – JSBach

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