2008-10-21 47 views
26

में शून्य है यह नियंत्रकों का उपयोग करने का सही तरीका नहीं हो सकता है, लेकिन मैंने इस समस्या को देखा और इसे ठीक करने का कोई तरीका नहीं निकाला।नियंत्रकों के उदाहरणों पर HttpContext एएसपीनेट एमवीसी

public JsonResult SomeControllerAction() { 

    //The current method has the HttpContext just fine 
    bool currentIsNotNull = (this.HttpContext == null); //which is false  

    //creating a new instance of another controller 
    SomeOtherController controller = new SomeOtherController(); 
    bool isNull = (controller.HttpContext == null); // which is true 

    //The actual HttpContext is fine in both 
    bool notNull = (System.Web.HttpContext.Current == null); // which is false   

} 

मैंने देखा है कि एक नियंत्रक पर HttpContext "वास्तविक" HttpContext कि आप System.Web.HttpContext.Current में मिल जाएगा नहीं है।

क्या नियंत्रक पर HttpContextBase मैन्युअल रूप से पॉप्युलेट करने का कोई तरीका है? या नियंत्रक का उदाहरण बनाने का एक बेहतर तरीका है?

उत्तर

24

नियंत्रक मैन्युअल रूप से बनाए जाने के लिए डिज़ाइन नहीं किए गए हैं जैसे आप कर रहे हैं। ऐसा लगता है कि आपको वास्तव में क्या करना चाहिए, इसके बजाय आपके पास एक सहायक वर्ग में जो भी पुन: प्रयोज्य तर्क है।

+1

ब्रैड, क्या आपके पास कहीं ऐसा है जो एमवीसी डिज़ाइन और सर्वोत्तम प्रथाओं को समझने में मदद कर सकता है? एमवीसी अब तक शांत रहा है, लेकिन मुझे मिले अधिकांश उदाहरण बहुत जटिल नहीं हैं। वे केवल एक ही रिकॉर्ड को अपडेट करने जैसे साधारण उदाहरणों पर जाते हैं। – Hugoware

+0

ब्रैड, मेरे पास एक ही समस्या है, और यह आपके द्वारा अनुशंसित की तरह एक सहायक वर्ग से भी आ रहा है। मैंने ह्यूगोवर (नीचे) द्वारा प्रदान किए गए फिक्स की कोशिश की, और इसे ठीक किया। क्या यह करने का यह सही तरीका है? –

0

क्या आप नियंत्रक से कुछ कार्यक्षमता का उपयोग करना चाहते हैं? या नियंत्रक एक कार्रवाई करते हैं?

यदि यह पूर्व है, तो शायद यह कुछ कोड है जिसे किसी अन्य वर्ग में विभाजित किया जाना चाहिए। यदि यह उत्तरार्द्ध देता है तो आप कि नियंत्रक के लिए एक विशिष्ट कार्रवाई कर ऐसा कर सकते हैं:

 

return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" }); 
 
5

HttpContext, ControllerContext में रिक्त है जब नियंत्रक बनाई गई है, क्योंकि यह सेट नहीं है। नियंत्रक का नियंत्रक इस संपत्ति को असाइन नहीं करता है, इसलिए यह शून्य होगा। आम तौर पर, HttpContext को नियंत्रकबिल्डर वर्ग के HttpContext पर सेट किया जाता है। कंट्रोलर कंट्रोलरबिल्डर वर्ग द्वारा बनाए जाते हैं, इसके बाद डिफॉल्ट कंट्रोलर फैक्टरी। जब आप नियंत्रक का अपना उदाहरण बनाना चाहते हैं, तो आप अपने स्वयं के नियंत्रक कॉन्टेक्स्ट के साथ नियंत्रक के ExecuteMethod का उपयोग कर सकते हैं। आप ऐसा नहीं करना चाहते हैं कि यह एक असली एप्लीकेशन है। जब आपको ढांचे के साथ कुछ और अनुभव मिलता है तो आपको इच्छित काम करने के लिए उचित विधि मिल जाएगी। जब आपको यूनिट टेस्ट में कंट्रोलर कॉन्टेक्स्ट की आवश्यकता होती है, तो आप कंट्रोलर कॉन्टेक्स्ट पर नकल करने के लिए एक मॉकिंग फ्रेमवर्क का उपयोग कर सकते हैं या आप इसे कक्षा बना सकते हैं।

आप this blog पर एएसपीनेट एमवीसी में अनुरोध प्रवाह का एक मॉडल पा सकते हैं।

जब आपका नया Asp.net mvc पर है, तो स्रोत कोड डाउनलोड करने के प्रयास के लायक है और अनुरोध को संसाधित करने के तरीके को ट्रैक करें।

0

क्या आप नियंत्रक कारखाने का उपयोग कर रहे हैं? यदि हां, तो आप घटक कैसे पंजीकृत कर रहे हैं?

मैं इस समस्या में भाग गया जहां मैंने अनजाने में विंडसर में क्षणिक की बजाय सिंगलटन के रूप में एक HttpContext- आधारित निर्भरता को जोड़ा था।

HttpContext सभी अनुरोधों के लिए शून्य था। मुझे उसको ट्रैक करने में थोड़ी देर लग गई।

61

अभी के लिए मैं निम्नलिखित करने जा रहा हूं। यह एक स्वीकार्य ठीक होने के लिए ... लगता है

public new HttpContextBase HttpContext { 
    get { 
     HttpContextWrapper context = 
      new HttpContextWrapper(System.Web.HttpContext.Current); 
     return (HttpContextBase)context;     
    } 
} 

कहाँ यह एक नियंत्रक वर्ग इन नियंत्रकों से इनहेरिट कर रहे हैं करने के लिए जोड़ा गया है।

मुझे यकीन नहीं है कि HttpContext शून्य होने का वांछित व्यवहार है, लेकिन यह मेरे लिए इस दौरान ठीक हो जाएगा।

+0

दो प्रकार के बीच काम करने के नए तरीके को समझने के लिए बहुत बहुत धन्यवाद। मेरे पास एक पुरानी कक्षा थी जो मैं एक एमवीसी नियंत्रक से उपयोग करने की कोशिश कर रहा था जिसने एक HttpContext ऑब्जेक्ट का उपभोग किया था।अब मेरे पास एक कक्षा है जो एक कन्स्ट्रक्टर ओवरलोड के साथ एक HttpContextBase ऑब्जेक्ट का उपभोग करती है जो आपके द्वारा उल्लिखित HttpContextWrapper कंस्ट्रक्टर का उपयोग करके HttpContext और HttpContextBase के बीच परिवर्तित हो जाएगी। – patridge

+0

हां, मैं भी यह समझने के लिए धन्यवाद कहना चाहूंगा! – Funka

+0

+1 ग्रेट पोस्ट। इसके लिए देख रहे थे। – magnus

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