2009-07-17 9 views
13

ओवरलोडिंग के लिए मैंने जो भी उदाहरण देखे हैं, उनमें आमतौर पर एक ही नाम के केवल दो विधियों के साथ अलग-अलग पैरामीटर होते हैं और एक जीईटी क्रिया का उपयोग करते हैं जबकि दूसरा POST का उपयोग करता है। क्या एक ही विधि पर दो या दो से अधिक अधिभार करना संभव है, सभी एक ही क्रिया के साथ? Can you overload controller methods in ASP.NET MVC?उसी क्रिया के साथ एएसपीएनटी एमवीसी नियंत्रक विधियों को अधिभारित करना?

उत्तर

8

मुझे नहीं लगता कि आप डिफ़ॉल्ट रूप से एक क्रिया के साथ एक ही कार्रवाई का नाम ओवरलोड कर सकते हैं:

यहाँ मैं क्या कर रहा हूँ की चर्चा करते हुए का एक उदाहरण है। जैसा कि आप जिस अन्य थ्रेड को इंगित करते हैं, आप & विधियों को अधिभारित कर सकते हैं, फिर विधि में मैप करने वाली क्रिया को बदलने के लिए एक विशेषता का उपयोग करें, लेकिन मुझे लगता है कि यह वह नहीं है जिसे आप ढूंढ रहे हैं।

एक अन्य विकल्प है कि मैं पहले का उपयोग किया है (कैसे जटिल/अलग अपने भार के हैं पर निर्भर करता है) बस मापदंडों & के लिए नल मान का उपयोग करने के लिए प्रभावी ढंग से एक साथ अपने विभिन्न हस्ताक्षर विलय है। तो बजाय:

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

बस है:

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

नहीं सबसे अच्छा समाधान है, लेकिन एक अधिभार बस तो इसकी नहीं एक समझौता बहुत बुरा दूसरे पर बनाता है।

एक अंतिम विकल्प है कि एक जाना (मैं इसे करने की कोशिश नहीं की है & भले ही यह काम करेंगे पता नहीं है, लेकिन तार्किक यह होना चाहिए) देने लायक हो सकता है, ActionMethodSelectorAttribute के एक कार्यान्वयन लिखना है तुलना कि विधि हस्ताक्षर & पर ControllerContext में पारित पैरामीटर सर्वश्रेष्ठ मिलान करने की कोशिश करता है (यानि अस्पष्टता को डिफ़ॉल्ट कार्यान्वयन से थोड़ा अधिक सख्ती से हल करने का प्रयास करें)।

+0

यह काफी मैं क्या कर रहा है, लेकिन मैं रूप public ActionResult DoSomething (पूर्णांक? आईडी, स्ट्रिंग नाम) इसे लिखने और बस विधि में के लिए String.IsNullOrEmpthy (नाम) एक चेक करते हैं। – Chris

0

मुझे लगता है कि यह नहीं है। के बाद से मैंने पाया कि MVC ढांचे वास्तव में परवाह नहीं है क्या आप पैरामीटर सूची में डाल दिया, उदाहरण के लिए, मेरी कार्रवाई की तरह है:

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

यह इस तरह का अनुरोध के लिए ठीक है: Domain.com/Index.aspx या Domain.com/Index.aspx?id=012901 या यहाँ तक कि Domain.com/Index.aspx?login=938293

प्रोग्रामिंग भाषा में अधिक भार के बाद से मतलब है कि आप (एक ही नाम के साथ) विभिन्न कार्यों का चयन इनपुट का उपयोग पैरामीटर, लेकिन इस मामले में एमवीसी की परवाह नहीं थी! तो एक्शनवर्ब ओवरलोडिंग के अलावा, मुझे लगता है कि यह ठीक नहीं है।

+0

हाँ, लेकिन मेरा मानना ​​है कि यह आपके यूआरएल सिंटैक्स की वजह से है, जहां मैं {नियंत्रक}/{action}/{id} टाइप सिंटैक्स का उपयोग कर रहा हूं। – 4thSpace

+0

मैंने ओवरलोडिंग का परीक्षण करने के लिए आपके जैसे सिंटैक्स की कोशिश नहीं की है, लेकिन ऐसा लगता है कि यह अभी भी संभव नहीं है क्योंकि एएसपीनेट एमवीसी अभी भी एक स्ट्रिंग के रूप में आईडी (पैरामीटर) का इलाज करेगा और इसे क्रिया में पास कर देगा (इसे टाइप करने का प्रयास कर सकता है अगर कार्रवाई केवल int स्वीकार करती है, लेकिन उस स्थिति में, आईडी पूर्ण होने पर कुछ त्रुटि उत्पन्न हो सकती है) – xandy

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