2009-05-11 11 views
24

मैं एक सामान्य नियंत्रक बनाने के प्रयास कर रहा हूँ अर्थात्:एएसपीनेट एमवीसी में एक सामान्य नियंत्रक बनाना संभव है?

public class MyController<T> : Controller where T : SomeType 
{ ... } 

हालांकि, जब मैं इसे इस्तेमाल करने की कोशिश, मैं हर जगह इस त्रुटि में चल रहा हूँ ...

नियंत्रक नाम में समाप्त होना चाहिए 'नियंत्रक'

तो, मेरा प्रश्न, क्या एएसपीनेट एमवीसी में एक सामान्य नियंत्रक बनाना संभव है?

धन्यवाद!

+0

आप इस माध्यम से क्या हासिल करने की कोशिश कर रहे हैं? जब MyController को तुरंत चालू किया जाता है तो उसे यह पता होना चाहिए कि टी क्या है, या तो सबक्लास या उसके निर्माता के माध्यम से। यदि आप गतिशील रूप से ऐसा करना चाहते हैं तो आपको एक नियंत्रक फैक्टरी – roryf

उत्तर

35

अगर मैं तुम्हें ठीक से समझ, तुम क्या करने कोशिश कर रहे हैं, मार्ग के लिए सभी अनुरोधों है टाइप जे

के सामान्य नियंत्रक के माध्यम से दिया गया मॉडल आप अनुरोध मॉडल के आधार पर टी को अलग-अलग करना चाहते हैं।

आप /Product/Index चाहते हैं अपने खुद के IControllerFactory लेखन और CreateController विधि इस तरह लागू करने से गति प्रदान करने के MyController<Product>.Index()

यह पूरा किया जा सकता:

public IController CreateController(RequestContext requestContext, string controllerName) 
{ 
    Type controllerType = Type.GetType("MyController") 
           .MakeGenericType(Type.GetType(controllerName)); 
    return Activator.CreateInstance(controllerType) as IController; 
} 
+0

यह दिलचस्प है, मैं इसे देख रहा हूं। धन्यवाद। –

+1

एनपी ... मत भूलना, "नियंत्रक" नामकरण सम्मेलन एक निर्णायक मानक है .. यदि आप किसी अन्य तरीके से तत्काल करना चाहते हैं, तो इसे करें! एक आईसीओन्ट्रोलर फैक्टरी लिखें जो आपके मानक को लागू करता है, एमएसएफटी की –

+1

इस समस्या के साथ, आपको जेनेरिक व्यूमोडल्स, बाध्यकारी और फ़िल्टरिंग के सामान्य तरीके, जेनेरिक सत्यापन की भी आवश्यकता होगी, यह – mare

1

डिफ़ॉल्ट नियंत्रक फैक्ट्री नियंत्रक नामों के आस-पास "सम्मेलन" का उपयोग करता है जब यह अनुरोध को प्रेषित करने के लिए नियंत्रक को खोजने का प्रयास कर रहा है। यदि आप चाहते थे तो आप इस लुकअप कार्यक्षमता को ओवरराइड कर सकते हैं, जो आपके जेनेरिक नियंत्रक को काम करने की अनुमति दे सकता है।

यह MSDN लेख ...

http://msdn.microsoft.com/en-us/magazine/dd695917.aspx

... क्या हो रहा है का एक अच्छा writeup है।

0

यदि मैं आप थे, तो मुझे MVC source मिल जाएगा और स्रोत कोड के साथ एक परीक्षण एमवीसी प्रोजेक्ट तैयार करें ताकि आप जांच सकें कि अपवाद कहाँ उत्पन्न हुआ है और देखें कि आप अपने सामान्य विचार और लागू "* नियंत्रक के बारे में क्या कर सकते हैं " नामकरण परंपरा।

9

हाँ आप कर सकते हैं, यह ठीक है और मैंने उन्हें बहुत उपयोग किया है।

क्या आप यह सुनिश्चित करने की जरूरत है कि जब आप MyController से विरासत आप अभी भी नियंत्रक के साथ प्रकार का नाम अंत है:

public class FooController : MyController<Foo> 
{ 
... 
} 
+0

लिखना होगा, मैं प्रत्येक प्रकार के लिए अलग नियंत्रक नहीं चाहता ... मैं एक सामान्य नियंत्रक को कई प्रकारों को संभालने के लिए चाहता हूं। –

+0

मैं इस कोशिश की होगी, और जब मैं करने के लिए मिल गया "सार्वजनिक शून्य संपादित करें (फू मद) {...}", MVC प्रकार फू, लेकिन आधार प्रकार मैं सामान्य वर्ग में सेट समझ में नहीं आया , इसलिए वस्तु "आइटम" के सभी पैरामीटर उनके प्रारंभिक मूल्य के लिए थे !!! – billy

+0

मेरा बुरा। भूल गए कि मेरे व्यूमोडेल में संपत्ति का नाम "आइटम" नहीं था ... – billy

1

यह asp.net mvc generic controller का डुप्लिकेट जो वास्तव में सही होता है जवाब। जेफ फ़्रिट्ज़ का जवाब बिल्कुल सही नहीं है। अपने स्वयं के IControllerFactory को बनाना ExpressionHelper.GetRouteValuesFromExpression में सीमा को पार नहीं करेगा जो आप देख रहे त्रुटि उत्पन्न कर रहा है। जब भी आप RedirectToAction, BuildUrlFromExpression, ActionLink, RenderAction, BeginForm, किसी भी विधि को कॉल करते हैं, तो अपने स्वयं के IControllerFactory को कार्यान्वित करने से आपको त्रुटियों के साथ छोड़ दिया जाएगा।

मेरे लिए दिलचस्प क्या है, यह है कि माइक्रोसॉफ्ट के "सम्मेलन द्वारा प्रतिबंध" पहले से ही बाधा द्वारा लागू किया गया है, जहां ExpressCelper.GetRouteValuesFromExpression विधि में टाइप किया गया है, जहां टीकंट्रोलर: कंट्रोलर "है।

string controllerName = typeof(TController).Name; 
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { 
    throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action"); 
} 

जब तक यह "नियंत्रक" में एक वर्ग के समाप्त होने के द्वारा विरासत में मिली है, क्योंकि typeof (AnyGeneric) .Name "नियंत्रक" के साथ समाप्त कभी नहीं होगा: नहीं जेनेरिक कभी सम्मेलन मान्यता को संतुष्ट करेगा।

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