2009-05-20 5 views
5

एएसपी.नेट और एमओएसएस विकास के लिए सी # का उपयोग करके, हमें अक्सर हमारे सी # कोड में जावास्क्रिप्ट एम्बेड करना होता है। इसे पूरा करने के वहाँ सोचा था की दो प्रचलित स्कूलों प्रतीत हो रहा है:आप अन्य प्रोग्रामिंग भाषाओं को अपने कोड में कैसे एम्बेड करते हैं?

string blah = "asdf"; 
StringBuilder someJavaScript = new StringBuilder(); 
someJavaScript.Append("<script language='JavaScript' >"); 
someJavaScript.Append("function foo()\n"); 
someJavaScript.Append("{\n"); 
someJavaScript.Append(" var bar = '{0}';\n", blah); 
someJavaScript.Append("}\n"); 
someJavaScript.Append("</script>"); 

सोचा था की अन्य स्कूल कुछ इस तरह है:

string blah = "asdf"; 
string someJavaScript = @" 
    <script language='JavaScript' > 
    function foo() 
    { 
     var bar = '" + blah + @"'; 
    } 
    </script>"; 

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

संपादित करें:
मुझे यह उल्लेख करना चाहिए कि अंतिम लक्ष्य अंतिम वेब पेज में जावास्क्रिप्ट स्वरूपित कर रहा है।

मैंने जेनरेट कोड के साथ बातचीत दिखाने के लिए उदाहरण भी बदल दिया।

+0

मेरा यह भी पूछने का अर्थ रहा है। जबकि दूसरा क्लीनर दिखता है, अगला नियंत्रणों के गतिशील नामकरण का प्रयास करें ... फिर यह भी उलझन में आता है क्योंकि आपको Control.ClientID –

+0

दस्तावेज़ का उपयोग करना होगा .getElementById ("" "+ String.Format (" {0} _ {1} " , base.ClientID, "foobar") + @ "" ") .... –

उत्तर

7

दूसरा स्पष्ट रूप से जिस तरह से, जिस तरह से, स्पष्ट है। पहले ऐसा करने के लिए वास्तव में कोई कारण नहीं हो सका।

मैं, तथापि, यह इस का विस्तार होगा:

string someJavaScript = string.Format(@" 
    <script language='JavaScript' > 
     function foo() 
     { 
      var bar = '{0}'; 
     } 
    </script>", blah); 

आप कई चीजें स्ट्रिंग के अंदर रहना है, तो String.Format विधि इनलाइन संयोजन के बजाय अधिक पठनीय बन जाएगा।

+0

यह एक बहुत अच्छा सुझाव है, हालांकि यह विकल्प के समूह के साथ जल्दी से अनावश्यक हो सकता है। –

+1

तो क्या आप वहां मौजूद तारों को ठीक से एन्कोड कर रहे हैं? क्या होगा यदि वहां एक एस्ट्रोफ़े या बैकस्लैश है? या, आकाश कम से कम ऑपरेटर मना कर दिया? –

3

फ़ाइल में संसाधन अनुभाग के रूप में जावास्क्रिप्ट जोड़ने के बारे में, ताकि इसे निष्पादन योग्य के संसाधन खंड से एक (एम्बेडेड) स्क्रिप्ट के रूप में लोड किया जा सके?

+0

हाँ .. यह सिर्फ काम करना मुश्किल बनाता है। वे पहले ही एमओएसएस के साथ काम करने के नुकसान से शुरू हो रहे हैं, ज्यादातर मामलों में ऐसा कुछ करना सबसे अच्छा है। –

+0

यदि आप अपना कोड सावधानीपूर्वक व्यवस्थित नहीं करते हैं। मेरा अनुभव यह है कि आमतौर पर केवल कुछ आईडी होती हैं और इस तरह आपको सर्वर साइड कोड से खींचना होता है। इन्हें उपर्युक्त के रूप में एम्बेड किए गए प्रारंभकर्ताओं में डाला जा सकता है। यदि आप स्वरूपण और पठनीयता चाहते हैं, तो जेएस फाइलों का उपयोग करें। – Ishmael

+0

@ इश्माएल, क्या आप अपने संसाधनों के साथ प्रारंभकर्ताओं का उपयोग करने का एक उदाहरण प्रदान कर सकते हैं? –

1

एक कारण के लिए स्ट्रिंग अक्षर: पठनीयता।

(प्रदर्शन एक गैर मुद्दा है, इस MOSS के बारे में हम बात कर रहे हैं ... है)

+0

यह कई भाषाओं पर लागू होता है, यानी - उदाहरण के लिए वीबी में एसक्यूएल एम्बेड करना। –

5

दूसरा तरीका, हालांकि बाहरी फ़ाइल का उपयोग करना बेहतर है और इसे बिना किसी पुन: संकलित किए बिना एप्लिकेशन में संशोधन करने की अनुमति देता है।

आपको चर डालने के लिए एक अच्छा, पठनीय तरीका भी चाहिए। स्ट्रिंग का उपयोग करना सबसे आसान तरीका है। फोर्मेट, लेकिन फिर प्रत्येक चर {0} या {1} है और इसलिए यह अपठनीय हो सकता है।

के बारे में कैसे:

public static string Insert(object dictionary, string into) 
{ 
    foreach (PropertyInfo property in dictionary.GetType().GetProperties()) 
     into = into.Replace("<%" + property.Name + "%>", 
          property.GetValue(dictionary, null).ToString()); 

    return into; 
} 

तो फिर तुम यह कर सकते हैं:

string js = Insert(new { divList, url }, 
        @"jQuery(document).ready(function(){ 
         jQuery('#<%divList%>').jqGrid({ 
          url:'<%url%>', 
          datatype: 'json', 
          mtype: 'GET', ... etc..."); 

या अगर स्क्रिप्ट एक बाहरी फ़ाइल में है:

string js = Insert(new { divList, url }, File.ReadAllText("someFile.js")); 

आप किसी भी वस्तु पारित कर सकते हैं और इसकी संपत्ति सीधे एएसपी-शैली से बचने वाले वाक्यविन्यास के माध्यम से पहुंचा जायेगी।

ऊपर दिया गया कार्यान्वयन बहुत ही कुशल नहीं है, जाहिर है, लेकिन यह छोटा है।

एक अन्य संभावना है कि एक .aspx पृष्ठ लिखना जो जावास्क्रिप्ट लौटाता है, और फिर आप इसे <script> संदर्भ के साथ अपने HTML पृष्ठों में शामिल कर सकते हैं। आप set the ContentType of the pageapplication/x-javascript होने के लिए कर सकते हैं।

यह आप इसे संशोधित करने के लिए सामान्य ASP.NET <%= %> टैग का उपयोग करने देगा, और जब आप स्क्रिप्ट को संपादित करने के पहले से ही बाहरी फाइलों के साथ एक तेजी से, मजबूत समाधान हो जाएगा मक्खी पर स्वचालित रूप से संकलन।

+0

क्या आप रीकंपाइल से बचने के लिए बाहरी फ़ाइल में रखने के लिए एक उदाहरण दे सकते हैं? किसी भी द्वारा प्रदान किए गए उत्तर में निष्पादन योग्य के संसाधन खंड को डालने का उल्लेख नहीं किया गया है, लेकिन इसे बदलने के लिए एक पुन: संकलन की आवश्यकता होगी। –

+0

मैंने इसका एक बहुत ही सरल उदाहरण जोड़ा है - यदि आप अपने वेब ऐप के भीतर फ़ाइल का पता लगाने के लिए, तो आप एएसपी.NET पथ मैपिंग फ़ंक्शंस का उपयोग करना चाहते हैं। –

+0

बहुत दिलचस्प है। मुझे आश्चर्य है कि यह MOSS वेब पार्ट/समाधान प्रतिमान में कितनी आसानी से अनुवाद करता है ... –

1

हमने इस उद्देश्य के लिए केवल एक पुस्तकालय लिखा है, जो सी # कोड में जावास्क्रिप्ट को एम्बेड करने के लिए एक धाराप्रवाह-वाक्यविन्यास प्रदान करता है। आप इसके बारे में अधिक पढ़ सकते हैं here

संक्षेप में, अपने उदाहरण के रूप में लिखा जाएगा:

var function = JS.Function("foo").Do(
    JS.Var(JS.Id("bar").AssignWith(blah))); 
string someJavaScript = "<script>" + function + "</script>"; 

एक के लिए, यह सुनिश्चित करें कि blah चर की सामग्री को ठीक से उद्धृत किया गया है कर देगा अगर यह उदाहरण के लिए, विशेष वर्ण हैं।

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