2009-06-30 9 views
6

समस्याWebForms: गतिशील (या पूर्ण) MasterPages

जब MasterPages साथ काम करने में स्क्रिप्ट टैग, एक आम जलन मैं में चलाने मास्टर में है कि स्क्रिप्ट टैग उपभोक्ता पृष्ठ के सापेक्ष हैं।

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

पिछली बार, मैंने वास्तव में इस पर हमला करने और एक अच्छा समाधान खोजने का फैसला किया।

प्रस्तावित समाधान

मैं एक रणनीति है कि Page_Load में ClientScriptManager.RegisterClientScriptInclude बुला इर्द-गिर्द घूमती करने की कोशिश की, लेकिन वह कुछ भी (दी, संबंधित पाइपलाइन की मेरी समझ अधूरा है) प्रस्तुत करने के लिए नहीं मालूम था।

मैं एक और एक है कि कुछ इस तरह देखा की कोशिश की:

<script language="javascript" src='<%= ResolveClientUrl("~/js/ddnmenu.js") %>' type="text/javascript"></script> 

... लेकिन उस एक अपवाद फेंकता है: नियंत्रण संग्रह संशोधित नहीं किया जा सकता है, क्योंकि नियंत्रण कोड ब्लॉक शामिल हैं।

कार्य (लेकिन कुछ हद तक fugly) कोड

तो, क्या मैं के साथ जा रहा समाप्त हो गया है सिर में एक शाब्दिक नियंत्रण जहाँ मैं उचित एचटीएमएल प्रस्तुत करना:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Me.SetupLiteralScriptsTag() 
End Sub 

Private Sub SetupLiteralScriptsTag() 
    'Build the script tags to import our JavaScript 
    Dim Builder As New StringBuilder 

    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery-1.3.2.min.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery.corners.min.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/bg.pos.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/moonstone.js"))) 

    Me.LiteralScriptTags.Text = Builder.ToString 
End Sub 

यह काम करता है, लेकिन मैं इसके बारे में आग नहीं लगा रहा क्योंकि यह एक बहुत ही आम समस्या के लिए एक बहुत अधिक कामकाज की तरह लगता है। क्या कोई बेहतर तरीका है?

उत्तर

3

मैं हर जगह ऐप रिश्तेदार वाक्यविन्यास का उपयोग करता हूं। इसमें कमी है कि यदि आप ऐप नाम/पथ बदलते हैं, तो आपके पास अपने सभी यूआरएल को अपडेट करने के लिए बहुत सारे काम हैं।

< स्क्रिप्ट भाषा = "JavaScript" src = "/ MyAppName/शामिल है/MyJavascriptFile.js">

या आप रूट अनुप्रयोग, तो काम कर रहे थे, तो:

< स्क्रिप्ट भाषा = "JavaScript "src ="/शामिल/MyJavascriptFile.js ">

+0

के माध्यम से अपना रास्ता फंसे हुए कम से कम काम मास्टरपेज परिदृश्य में कम किया गया है। यह आश्चर्यजनक है कि मुझे नहीं पता था कि आप इसे इस तरह से कर सकते हैं ... मैं वेब ऐप्स पर बहुत लंबे समय से काम कर रहा हूं! –

+0

मैंने इसे एम 4 एन के उत्तर के Iinstead को स्वीकार कर लिया क्योंकि यह सबसे आसान है। आप अपनी परियोजना के लिए किसी भी नई अवधारणा को पेश किए बिना इसका उपयोग कर सकते हैं ... हालांकि मैं अब इसके लिए ScriptManager का उपयोग करता हूं। –

0

आप रूट से हमेशा अपनी स्क्रिप्ट का संदर्भ दे सकते हैं। आईई:

<script language="javascript" src="/scripts/file.js"></script> 

तब आपके ऐप में कोई भी पृष्ठ जावास्क्रिप्ट को ठीक से प्राप्त करेगा।

इसके अलावा, चूंकि आप एएसपी.नेट के साथ काम कर रहे हैं, तो आप एप्लिकेशन आधारित सापेक्ष पथ प्रदान करने के लिए "~" चरित्र का उपयोग कर सकते हैं।Rick Strahl's article on ASP.NET paths for more info.

+0

टिल्ड केवल सर्वर नियंत्रण के अंदर काम करता है। हालांकि मैं इसे यहां इस्तेमाल करना पसंद करूंगा। –

7

आप मास्टर पृष्ठ के लिए एक scriptmanager जोड़ सकते हैं देखें और उस के माध्यम से जावास्क्रिप्ट फ़ाइलों में शामिल हैं:

<asp:ScriptManager ...> 
    <Scripts> 
    <asp:ScriptReference Path="~/js/ddnmenu.js" /> 
    </Scripts> 
</asp:ScriptManager> 

(कि दृष्टिकोण का एक और लाभ यह है कि आप तो अपने सामग्री पृष्ठों के लिए एक ScriptManagerProxy नियंत्रण जोड़ सकते हैं और उपयोगकर्ता नियंत्रण) किसी भी अतिरिक्त स्क्रिप्ट शामिल करने के लिए।

एएसपी के लिए कुछ तृतीय-पक्ष प्रतिस्थापन: ScriptManager (जैसे telerik के RadControls सूट से या Ajax control toolkit से) इस तरह के (एक फ़ाइल में सभी शामिल जावा स्क्रिप्ट फ़ाइलें विलय इस प्रकार की आवश्यकता की संख्या कम करने के रूप में HTTP और भी अधिक सुविधाएं प्रदान करती एक पृष्ठ लोड करने के लिए अनुरोध)।

संपादित करें: स्क्रिप्ट मैनेजर का उपयोग करके कुछ अन्य फायदे हैं। आप ब्राउज़र पर अपनी स्क्रिप्ट के डीबग या रिलीज संस्करण भेज सकते हैं, या संस्कृति-निर्भर स्क्रिप्ट इत्यादि आदि। एक सिंहावलोकन के लिए this page in MSDN पर एक नज़र डालें।

+0

मुझे यह जवाब पसंद है। काश मैं उन दोनों को स्वीकार कर सकता हूं। –

+0

फिर बस मेरा स्वीकार करें ;-) - कोई गंभीरता से स्वीकार न करें, जो भी जवाब आपको सबसे ज्यादा मदद करता है उसे स्वीकार करें। – M4N

0

नियंत्रण संग्रह बदला नहीं जा सकता की तरह Page.resolveUrl("~/somefile.js");

काम करता है का उपयोग करें क्योंकि नियंत्रण कोड ब्लॉक

कि त्रुटि परिचित लगता है शामिल हैं। This पृष्ठ ने मदद की जब मैंने इस

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