2009-04-06 10 views
9

मैंने देखा कि MapRoute एक्सटेंशन में एक अधिभार शामिल है जो स्ट्रिंग [] पैरामीटर को स्वीकार करता है जिसे 'नेमस्पेस' कहा जाता है। मैंने पढ़ा कि Google के लिए मेरे पास क्या था, और माना जाता है कि फ्रेमवर्क को उन स्थानों पर नियंत्रकों को ढूंढने में मदद करना है जो अन्यथा नहीं दिखेंगे।एएसपी.नेट एमवीसी कंट्रोलर नेमस्पेस सरणी

मैंने कुछ स्पाइकिंग की, और अजीब स्थानों में नियंत्रकों को डालने का प्रयास किया। मैंने स्क्रिप्ट फ़ोल्डर में एक रखा है; मैंने एक अलग असेंबली में एक अलग रूट नेमस्पेस के साथ भी बनाया।

नेमस्पेस परम में कोई भी डालने के बिना, सबकुछ ठीक काम करता है। अगर मैंने नेमस्पेस परम में केवल नामस्थानों में से एक रखा है, तो यह अभी भी मेरे सभी नियंत्रकों को मिला है। मैंने सोचा कि शायद यह उस सरणी का उपयोग समान नामित नियंत्रकों के बीच असंबद्ध करने के लिए करेगा, लेकिन ऐसा नहीं हुआ था। MyProj.Controllers में एक HomeController और SomeOtherName.Stuff में से एक अभी भी टकरा जाएगा।

तो मेरा सवाल यह है कि क्या पैरामीटर बहिष्कृत है? या फिर भी यह किसी भी तरह से इस्तेमाल किया गया है जिसे मैंने अभी तक समझना नहीं है?

उत्तर

5

ठीक है, तो आगे परीक्षण के बाद, मुझे लगा कि यह फ़िल्टर नहीं है, बिल्कुल, लेकिन यह भी है। मैंने आपको 'जवाब' क्रेडिट दिया है भले ही आप आंशिक रूप से गलत हैं।

तो, यह सब कुछ करता है, जैसा कि मैंने सोचा था कि ऐसा करना चाहिए कि यह कहना चाहिए कि यह असंबद्ध है। असल में, तार्किक प्रवाह कुछ इस तरह है: _cache कि नामस्थान सरणी

  • कि अगर पाया है में से मेल खाता में एक नाम स्थान के लिए

    • देखो, सही नाम के एक नियंत्रक के लिए देखो
    • - अगर है कि पाया है, यह
    • वापसी - अगर यह नहीं मिला है, अन्य सभी स्थानों खोज है कि यह सामान्य रूप से देखने के लिए चाहते हैं
  • अगर यह नहीं मिला है, हर खोज वापसी जहां

तो, संक्षेप में, मेरा विचार है कि नेमस्पेस सरणी असंबद्ध करने के लिए काम करेगी सही थी।कारण इस संबंध में मेरा पहला परीक्षण असफल रहा है कि यह केवल एक सही मैच करता है, और मैंने असेंबली से रूट एन/एस का उपयोग करने की गलती की है (दूसरे शब्दों में, MyRoot.Controllers के बजाय MyRoot)।

इस नामस्थान की चीज़ क्या है, फिर, होम कंट्रोलर दो अलग-अलग नामस्थानों में है और यूआरएल या पैराम्स के आधार पर अलग-अलग मिलान करें।

4

नहीं, मान बहिष्कृत नहीं किया गया है। इसका उपयोग DefaultControllerFactory.cs में किया जाता है। ध्यान दें कि यदि मूल्य प्रदान किया जाता है, तो यह खोजे गए मानक नाम रिक्त स्थान को पूरी तरह से बदल देता है। जब पैरामीटर नहीं दिया जाता है, नाम रिक्त स्थान की खोज हमारे निर्धारित द्वारा:

HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase); 

जब पैरामीटर आपूर्ति की जाती है, सूची आपूर्ति इस मान को बदल देता है।

या तो मामले में, DefaultControllerFactory कॉल:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

... सूची के साथ, या तो एक आप की आपूर्ति की, या डिफ़ॉल्ट। तो यह स्पष्ट है कि मान समर्थित है।

जब आप वहां स्रोत कोड देखते हैं, और कंट्रोलर टाइप कैश में, आप नेमस्पेस मान का असली उद्देश्य देख सकते हैं: यह नियंत्रक फैक्ट्री को उन स्थानों पर देखने का कारण नहीं बनाता है जो अन्यथा नहीं दिखेंगे; बल्कि यह फ़िल्टर है। दूसरे शब्दों में, यह डिफॉल्ट कंट्रोलर फैक्ट्री को रिक्त स्थान देखने और नाम देने से रोकता है जो अन्यथा नियंत्रकों की खोज करेगा।

+0

मुझे पता है कि यह कैसे काम करना चाहिए, और मुझे वही स्थान मिला जो आप डिफॉल्ट कंट्रोलर फैक्ट्री में वर्णित कर रहे हैं, लेकिन जब मैंने ऊपर वर्णित परीक्षण चलाया, तो यह नहीं हुआ कि यह कैसे काम करता है। मैंने नामस्थानों की आपूर्ति की जो मौजूद नहीं थे, और कारखाने को अभी भी मेरा नियंत्रक मिला। – Paul

+0

नियंत्रक टाइप कोड में कोड यकीन है कि यह मेरे लिए इस तरह से काम करता है। आप स्रोत के साथ निर्माण करके इसे डीबग कर सकते हैं। शायद ऐसा कुछ है जिसे आपने आपूर्ति नहीं की है? –

+0

मैं मानता हूं कि यह उस तरह से दिखता है, और मैंने पहले परीक्षण करते समय w/स्रोत बनाया; मैं फिर से/कुछ अलग पैरा कोशिश करेंगे। – Paul

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