2013-02-20 52 views
5

मैं एक ओपन सोर्स प्रोजेक्ट (नोपॉमर्स) का अनुकूलन कर रहा हूं। यह एक महान सॉफ्टवेयर है और प्लगइन का उपयोग करके विस्तारशीलता का समर्थन करता है। एक प्लगइन के लिए, मैं एक दृश्य में जानकारी जोड़ना चाहता हूं, ऐसा करने के लिए, मैं नियंत्रक से उत्तराधिकारी बनना चाहता हूं और उन कार्यों को ओवरराइड करना चाहता हूं जिन्हें मुझे बदलने की जरूरत है।क्या एमवीसी कंट्रोलर एक्शन ओवरराइड करने का कोई तरीका है?

public class MyController : OldController{ 
//stuff 

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

} 

मैं अपने प्लगइन से रास्ता बदल दिया है, लेकिन जब इस कार्रवाई मैं निम्नलिखित त्रुटि मिलती है कहा जाता हो:

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

वहाँ किसी भी तरह से मैं इस विधि को ओवरराइड कर सकते है तो यह मेरी नियंत्रक है ? (पुनश्च: मैं ओवरराइड कीवर्ड का उपयोग नहीं कर सकते क्योंकि यह के रूप में आभासी, सार या OldController में ओवरराइड चिह्नित नहीं है)

धन्यवाद, ऑस्कर

+1

कैसे के बारे में 'OldController' से _deriving_ नहीं बल्कि इसकी बजाय सभी' OldController' अपने 'MyController' वर्ग ([प्रॉक्सी पैटर्न] के समान की तरह (http://www.dofactory.com में लिपटे तरीकों प्रदान /Pternterns/PatternProxy.aspx#_self1)) –

+0

यदि यह वर्चुअल चिह्नित किया गया तो क्या यह काम करेगा? मैंने एक प्रतिकूल तरीके से सोचा होगा कि आपने – Rikon

+0

काम किया होगा जो आप प्राप्त करना चाहते हैं जो वर्तमान नियंत्रक वर्ग से आसानी से एक्स्टेंसिबल नहीं है? –

उत्तर

6

तो OldController की विधि कुछ है, इस तरह redeclare।

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

हां, यह एक अच्छा तरीका है जो अच्छा लगता है, @Uwe क्लेम ने टिप्पणियों में इसका प्रस्ताव दिया। डेवए लगता है क्योंकि उसके पास बहुत अच्छी अंतर्दृष्टि है, इसलिए मैं इसे आजमाने से पहले अपने विचार की जांच करूंगा :) – JSBach

+1

@ ऑस्कर, आपकी ज़रूरतों के आधार पर, मैं कंट्रोलर क्लास से इबट्टुल्गा के तरीके से विरासत में रहने का सुझाव देता। यह वह दृष्टिकोण है जिसे आप ढूंढ रहे हैं! ;) –

+1

@ डेवए बहुत बहुत धन्यवाद! – JSBach

संबंधित मुद्दे