2011-10-23 13 views
16

मुझे पता है कि वर्तमान नियंत्रक नामAsp.net MVC 3 वर्तमान नियंत्रक उदाहरण (सिर्फ नाम नहीं)

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString(); 

पाने के लिए लेकिन वहाँ किसी भी तरह से (कुछ वर्ग में मौजूदा नियंत्रक उदाहरण पाने के लिए है मिल एक कार्रवाई में नहीं और एक दृश्य में नहीं)?

+1

कहां? एक मॉडल में? एक विचार में? बेशक यदि आप किसी कार्रवाई में हैं तो आप इसका उपयोग अपने नियंत्रक के संदर्भ में कर सकते हैं, लेकिन मुझे लगता है कि यह मामला नहीं है :)। कुछ वर्गों में – BigMike

+0

(किसी कार्रवाई में नहीं और दृश्य में नहीं) – Alexandre

+0

चूंकि एमवीसी पैटर्न में आप एक क्रिया में रहना चाहते हैं, जब तक कि आप कुछ डेटा मॉडल के विधि प्रवाह या कुछ सहायक में न हों। बस शून्य संदर्भों से बचने के लिए मैं नियंत्रक के लिए अपनी कक्षा विधि में एक पैरामीटर जोड़ूंगा, और उसके बाद प्रवाह शुरू होता है और इसे पास करता हूं। – BigMike

उत्तर

22

डिफ़ॉल्ट रूप से आप ControllerContext.Controller के साथ या ViewContext.Context के साथ एक नियंत्रक के अंदर केवल Controller तक पहुंच सकते हैं। किसी वर्ग से इसे एक्सेस करने के लिए आपको एक कस्टम ControllerFactory लागू करने की आवश्यकता है जो नियंत्रक उदाहरण को कहीं और संग्रहीत करता है और इसे वहां से पुनर्प्राप्त करता है। उदाहरण में Request.Items:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var controller = base.CreateController(requestContext, controllerName); 
     HttpContext.Current.Items["controllerInstance"] = controller; 
     return controller; 
    } 
} 

तो आप इसे अपने Application_Start में रजिस्टर:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

और तुम नियंत्रक उदाहरण बाद में प्राप्त कर सकते हैं:

public class SomeClass 
{ 
    public SomeClass() 
    { 
     var controller = (IController)HttpContext.Current.Items["controllerInstance"]; 
    } 
} 

लेकिन मैं कुछ दूसरे तरीके से मिलेगा इस "हैकी" वर्कअराउंड की बजाय मेरी कक्षा में नियंत्रक उदाहरण पास करने के लिए।

+6

आपको शायद HttpContext.Current.Session ["नियंत्रक इंस्टेंस"] को HttpContext.Current.Items ["नियंत्रक इंस्टेंस"] में बदलना चाहिए क्योंकि सत्र कुछ कॉन्फ़िगरेशन के साथ डेटाबेस में समाप्त हो सकता है। – John

0

मुझे किसी ने सही करने के लिए करता है, तो मैं क्या कर रहा हूँ पूरे Asp.Net पेज जीवन चक्र/के लिए हानिकारक है होगा आप यह कर सकते हैं जो कुछ भी लेकिन निश्चित रूप से:

नियंत्रक

ViewBag.CurrentController = this; 

ध्यान में रखते हुए में

var c = ViewBag.CurrentController; 
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null); 

मेरे मामले में, मेरे पास एक बेस नियंत्रक था जो सभी नियंत्रक विस्तारित करते थे। उस बेस नियंत्रक में RenderViewToString नामक एक स्थिर विधि रहती थी और इसे नियंत्रक की आवश्यकता होती थी। चूंकि मैंने सोचा कि मैं सी के लिए इस बिंदु पर एक खाली नियंत्रक के एक नए उदाहरण को तुरंत चालू कर सकता हूं, मैंने इसे सुंदर व्यूबैग कंटेनर में दृश्य में भेजा है जो Asp.Net MVC की दुनिया में मौजूद है। कारणों से मैं अब नहीं जा सका, मैं नियंत्रक में स्ट्रिंग को पुनर्प्राप्त नहीं कर सका और केवल उस दृश्य को भेज सकता था (यह वही था जो मैंने आवश्यकताओं को बदलने से पहले किया था)।

कारण मैंने इसे ऐसा किया है, इस तरह से PHP और JS जैसी अन्य भाषाओं में, कक्षाओं को स्थानांतरित करने के समान सरल तरीके हैं।

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