2013-02-20 14 views
5

Ich passe ein Open-Source-Projekt (NopCommerce) an. Es ist eine großartige Software und unterstützt die Erweiterbarkeit mit Plugins. Für ein Plugin möchte ich Informationen zu einer Ansicht hinzufügen, dazu möchte ich vom Controller erben und die Aktionen überschreiben, die ich ändern muss. Das ist also mein Controller:Gibt es eine Möglichkeit, eine MVC-Controller-Aktion zu überschreiben?

public class MyController : OldController{ 
//stuff 

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

} 

ich die Strecke von meinem Plugin geändert, aber wenn diese Aktion aufgerufen ich die folgende Fehlermeldung erhalten:

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

Gibt es eine Möglichkeit, diese Methode überschreiben können ? (Ps: Ich kann nicht das Schlüsselwort override verwenden, da es nicht als virtuelle, abstrakte oder Überschreibung in den OldController gekennzeichnet)

Dank, Oscar

+1

Wie wäre es nicht von 'OldController' _deriving_ sondern bieten alle' OldController' Methoden eingewickelt in Ihrer 'MyController' Klasse (eine Art ähnlich die [Proxy Muster] (http://www.dofactory.com /Patterns/PatternProxy.aspx#_self1)) –

+0

Wenn es virtuell markiert wäre, hätte es funktioniert? Ich hätte auf perverse Weise gedacht, dass das, was du hättest, funktioniert hätte – Rikon

+0

Was willst du erreichen, das ist nicht einfach erweiterbar von der aktuellen Controller-Klasse? –

Antwort

6

Wenn OldController Methode ist wenig, neu deklariert wie diese.

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

Ja, das ist ein Ausweg, der gut klingt, @Uwe Kleim hat es in den Kommentaren vorgeschlagen. DaveA klingt, als hätte er einen sehr guten Einblick, also werde ich seine Idee überprüfen, bevor ich das hier probiere: – JSBach

+1

@Oscar, je nach deinen Bedürfnissen hätte ich vorgeschlagen, eine aus der Controller-Klasse genau so zu erben wie ebattulga. Das ist der Ansatz, nach dem Sie suchen! ;) –

+1

@DaveA Vielen Dank! – JSBach

Verwandte Themen