2010-05-22 15 views
6

मैं कुछ वृद्धि के साथ this question के समान कुछ हासिल करना चाहता हूं।एएसपी.नेट रूटिंग के साथ पेड़-संरचित यूआरएल कैसे रूट करें?

एक एएसपी.नेट एमवीसी वेब एप्लिकेशन है।

मेरे पास इकाइयों का एक पेड़ है।
उदाहरण के लिए, Page कक्षा जिसमें बच्चों नामक एक संपत्ति है, जो IList<Page> प्रकार है। (Page वर्ग का एक उदाहरण डेटाबेस में एक पंक्ति से मेल खाता है।)

ध्यान दें कि साइट के मालिक किसी भी समय एक नया पृष्ठ जोड़ सकते हैं, या मौजूदा को हटा सकते हैं, और यूआरएल को उन परिवर्तनों को भी प्रतिबिंबित करना चाहिए।

मैं डेटाबेस में प्रत्येक Page पर एक अद्वितीय यूआरएल असाइन करना चाहता हूं।
मैं Page ऑब्जेक्ट्स को PageController नामक नियंत्रक के साथ संभालता हूं।

उदाहरण URL:

http://mysite.com/Page1/ 
http://mysite.com/Page1/SubPage/ 
http://mysite.com/Page/ChildPage/GrandChildPage/ 

आप चित्र प्राप्त।
तो, मैं प्रत्येक Page ऑब्जेक्ट को अपना स्वयं का यूआरएल रखना चाहता हूं जो उसके माता-पिता के यूआरएल के बराबर है और इसका अपना नाम है।
इसके अतिरिक्त, मैं Page को / (रूट) URL पर मैप करने की क्षमता भी चाहूंगा।

मैं इन नियमों आवेदन करना चाहते हैं:

  1. एक URL किसी अन्य मार्ग से संभाला जा सकता है, तो या एक फ़ाइल निर्दिष्ट URL में फाइल सिस्टम में मौजूद है, सामान्य URL मानचित्रण हो
  2. जाने
  3. एक यूआरएल आभासी पथ प्रदाता द्वारा नियंत्रित किया जा सकता है, तो, अगर कोई अन्य है कि इसे संभाल
  4. जाने PageController वर्ग
करने के लिए अन्य यूआरएल के नक्शे

मुझे this question, और also this one और this one भी मिला, लेकिन वे बहुत मदद नहीं कर रहे थे, क्योंकि वे मेरे पहले दो बिंदुओं के बारे में स्पष्टीकरण नहीं देते हैं।

मैं निम्नलिखित संभव soutions देखें:

  • प्रत्येक पृष्ठ के लिए मानचित्र एक मार्ग invidually।
    एप्लिकेशन के शुरू होने पर मुझे पूरे पेड़ पर जाने की आवश्यकता होती है, और मार्ग तालिका के अंत में एक सटीक मिलान मार्ग जोड़ना पड़ता है।
  • मैं {*path} के साथ एक मार्ग जोड़ सकता हूं और एक कस्टम IRouteHandler लिखता हूं जो इसे संभालता है, लेकिन मैं नहीं देख सकता कि मैं पहले दो नियमों से कैसे निपट सकता हूं, क्योंकि इस हैंडलर को सबकुछ संभालना होगा।

अब तक, पहला समाधान सही लगता है, क्योंकि यह भी सबसे आसान है। लेकिन फिर भी, उस मामले में भी मुझे यकीन नहीं है कि मैं अनुरोधों को संभालने के लिए PageController कैसे बना सकता हूं।

मैं इस पर आपके विचारों की वास्तव में सराहना करता हूं।

अग्रिम धन्यवाद!

संपादित करें: अब मेरे पास प्राप्त हर उत्तर के हर पहलू की जांच करने का समय था। मैंने नील के जवाब को स्वीकार किया, क्योंकि वह एक चीज कैसे काम करता है इस बारे में सबसे अच्छा स्पष्टीकरण प्रदान करता है। मैंने अन्य सभी उत्तरों को भी उखाड़ फेंक दिया, क्योंकि वे अच्छे विचार प्रदान करते हैं।

उत्तर

3

मार्गों को संग्रह में जोड़े गए क्रम में संसाधित किया जाता है। मौजूदा मार्गों के बाद आप अपना कस्टम मार्ग जोड़ सकते हैं ताकि यह सुनिश्चित किया जा सके कि यह अनुरोध संभालने का मौका पाने वाला आखिरी व्यक्ति है। यह आपको इससे पहले मौजूदा फाइलों (आभासी या अन्यथा) के लिए मार्ग जोड़ने की अनुमति देगा और इसलिए मानदंड 1 और 2.

डिफ़ॉल्ट रूप से, मार्ग संग्रह में संग्रहीत किसी भी मार्ग को लागू करने से पहले एमवीसी रूटिंग मौजूदा फ़ाइलों तक पहुंच जाएगी; http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx देखें। (पॉल के लिए हत्तीप - टिप्पणियां देखें)।

अपने पृष्ठ नियंत्रक के अनुरोधों को रूट करने के लिए, बस एक कस्टम मार्ग बनाएं जो वर्चुअल पथ की जांच करता है और यदि यह डेटाबेस में किसी पृष्ठ के पैटर्न से मेल खाता है तो RouteData देता है। वर्चुअल पथ से निकाले गए उचित मानों के साथ अपना RouteData सेट करें (उदाहरण के लिए पथ कुंजी/माता-पिता/चाइल्ड/ग्रैंडचिल्ड पर पथ कुंजी सेट करें), अपने पृष्ठ नियंत्रक नाम (जैसे पृष्ठ) पर नियंत्रक कुंजी सेट करें और कार्रवाई के नाम पर कार्रवाई करें कि आप निष्पादित करना चाहते हैं (उदाहरण के लिए दिखाएँ)। RouteDataMvcRouteHandler के साथ बनाया जाना चाहिए (सुनिश्चित नहीं है कि यह सही वर्ग का नाम है)।

यह सुनिश्चित करें कि अपने डेटाबेस संचालित पृष्ठों के लिए यूआरएल को सही ढंग से वापस आ रहे हैं, RouteBase की GetVirtualPath(RequestContext, RouteValueDictionary) विधि ओवरराइड और में पारित कर दिया है कि अगर यह एक डेटाबेस संचालित पेज है निर्धारित करने के लिए मार्ग मूल्यों का उपयोग और अगर यह (आभासी पथ आवश्यक डेटा बनाने है या अन्यथा शून्य वापस)।

अधिभावी GetRouteData और GetVirtualPath सहायता के लिए, System.Web.Routing.RouteBase और System.Web.Routing.Route की परिलक्षित स्रोत कोड को देखो; उसके बाद Google आपका मित्र है।

नियंत्रक, कार्रवाई और किसी भी अन्य मार्ग मान दिए गए यूआरएल को निर्धारित करने के लिए रूट्स का उपयोग विपरीत में किया जाता है। आप इस संदर्भ के भीतर पृष्ठ के यूआरएल बनाने के लिए इसका उपयोग करने में सक्षम होना चाहिए कि अनुरोध किया जा रहा है।

+0

मैं मौजूदा फाइलों के लिए मार्ग क्यों और कैसे जोड़ूं? इसके अलावा, मैं पेड़ के लिए मार्ग कैसे बनाऊंगा और उन्हें उचित नियंत्रक के पास निर्देशित करूंगा? – Venemo

+1

आपको इसकी आवश्यकता नहीं है; डिफ़ॉल्ट रूप से रूटिंग सिस्टम एक मौजूदा फ़ाइल की जांच करेगा और उस नियंत्रक और क्रिया को ढूंढने की कोशिश करने के लिए उस परोसने का पक्ष लेगा। – Paul

+0

@ पॉल - धन्यवाद। क्या यह आभासी पथ प्रदाता द्वारा प्रदान की गई फ़ाइलों पर भी लागू होता है? – Venemo

1

एक बार अलग-अलग विचार टी 4 (टेक्स्ट टेम्पलेट ट्रांसफॉर्मेशन टूलकिट) का उपयोग अपने बच्चों को पढ़ने और अपनी ग्लोबल.एक्सएक्स फ़ाइल की सामग्री उत्पन्न करने के लिए करना है।

संपादित करें: मूल रूप से टी 4 के साथ आप टेक्स्ट फ़ाइल पीढ़ी को स्वचालित कर सकते हैं। उदाहरण के लिए, कुछ बड़े संग्रहों की मैन्युअल रूप से प्रतिलिपि बनाने और उन्हें कुछ विशिष्ट संदर्भ के साथ टेक्स्ट फ़ाइल (जैसे INSERT INTO [MyTable] (Text) VALUES (@ItemText)) में चिपकाने के बजाय, आप एक टी 4 इंजन संग्रह को पढ़ सकते हैं और आपके लिए इन सम्मिलन विवरण उत्पन्न कर सकते हैं। यह स्थैतिक है और रनटाइम के लिए नहीं है।

मुझे लगता है कि Pro Entity Framework 4.0 पुस्तक से बहुत अच्छा परिचय उपलब्ध है।

लेकिन यदि आप कहते हैं कि आपको इसे गतिशील रूप से करने की आवश्यकता है, तो यह आपके लिए टूल नहीं हो सकता है।

+0

अगर आप कुछ और विवरण प्रदान कर सकते हैं तो मुझे खुशी होगी, मैंने कभी टी 4 के बारे में नहीं सुना है। बीटीडब्ल्यू, पेज रनटाइम के दौरान बदल सकते हैं। साइट के व्यवस्थापक जितना चाहें उतना जोड़/हटा/बदल सकते हैं। – Venemo

+0

यह इंगित करने के लिए धन्यवाद कि यह मेरे लिए उपकरण नहीं हो सकता है। वास्तव में, संग्रह रनटाइम में बदल जाता है। वैसे भी, मुझे जवाब देने के लिए समय निकालने के लिए धन्यवाद। :) – Venemo

1

जब आप पृष्ठ को सहेजते हैं तो आप अपने पृष्ठों की संरचना को जानते हैं। इसलिए, आप प्रत्येक पृष्ठ के लिए यूआरएल उत्पन्न कर सकते हैं और इसे डेटाबेस रिकॉर्ड में सहेज सकते हैं। फिर आप {*path} नियम का उपयोग कर सकते हैं और डेटाबेस में सटीक मिलान पा सकते हैं। यह नियम आपकी नियम परिभाषा में अंतिम होना चाहिए, ताकि आप अन्य मार्गों से मेल खा सकें।

उदाहरण के लिए, आपके Page1 का कोई मूल पृष्ठ नहीं है, यह यूआरएल Page1 है। आपका SubPage यह माता-पिता जानता है ताकि यह यूआरएल Page1/SubPage इत्यादि को ग्रेनरेट कर सके।

+0

rarouš - आपके उत्तर के लिए धन्यवाद! यह एक अच्छी आईडी है लेकिन '{* पथ}' वास्तविक (और वर्चुअल) फ़ाइल नामों को भी पकड़ नहीं पाएगी? – Venemo

1

आप "Page/{*path}" पैटर्न का उपयोग कर सकते हैं। फिर आप स्ट्रिंग को '/' पर स्ट्रिंग करके पथ को विघटित कर सकते हैं और उस पर चल सकते हैं, या आप डीबी में [जेनरेट] पथ को संग्रहीत करने के लिए रारौस के सुझाव का उपयोग कर सकते हैं और प्रत्यक्ष लुकअप कर सकते हैं।

यदि आप रारौस विधि का उपयोग करते हैं तो आपको पैरेंट पथ बदलते समय सभी बच्चों के लिए अपनी तालिका में पथ प्रविष्टियां अपडेट करनी होंगी। यह केवल एक अद्यतन क्वेरी के साथ पर्याप्त किया जा सकता है।

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

इस तकनीक का उपयोग करके आप एक पृष्ठ नियंत्रक रख सकते हैं और देख सकते हैं कि इन सभी पृष्ठों को उसी तरह से संभालता है। आपकी अन्य आवश्यकताओं को एमवीसी ढांचे द्वारा स्वचालित रूप से संभाला जा रहा प्रतीत होता है।

आपका पथ इस प्रकार दिखाई देगा:

http://mysite.com/Page/Page1/ 
http://mysite.com/Page/Page1/SubPage/ 
http://mysite.com/Page/Page/ChildPage/GrandChildPage/ 

आप निश्चित रूप से "पृष्ठ" के अलावा किसी अन्य उपसर्ग का उपयोग कर सकते हैं।

+0

@Andre - आपके उत्तर के लिए धन्यवाद! अब तक यह सबसे अच्छा विचार है। :) – Venemo

+0

आप अपनी रूट प्रविष्टियों को सबसे विशिष्ट से कम से कम विशिष्ट से ऑर्डर कर सकते हैं और उपसर्ग ड्रॉप कर सकते हैं, रूटटेस्टर का उपयोग करें (http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx) को जांचने के लिए मार्गों। –

+0

http://stephenwalther.com/blog/archive/2008/08/03/asp-net-mvc-tip-29-build-a-controller-to-debug-your-custom-routes.aspx –

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