2009-05-10 5 views
6

मुझे पता है कि इससे पहले पूछा गया है, लेकिन मुझे बाहरी जेएस फाइलों में नियंत्रण के संदर्भ प्राप्त करने का एक अलग तरीका मिला है, लेकिन मुझे यकीन नहीं है कि यह समग्र गति के संदर्भ में कैसे नीचे जाएगा।क्लाइंट आईडी को बाह्य जेएस फाइलों में लाने का कोई बेहतर तरीका है?

मेरे कोड

public static void GenerateClientIDs(Page page, params WebControl[] controls) { 

     StringBuilder script = new StringBuilder(); 
     script.AppendLine("<script type=\"text/javascript\">"); 

     foreach (WebControl c in controls) { 
      script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID)); 
     } 

     script.AppendLine("</script>"); 

     if (!page.ClientScript.IsClientScriptBlockRegistered("Vars")) { 
      page.ClientScript.RegisterClientScriptBlock(page.GetType(), "Vars", script.ToString()); 
     } 
    } 

यह था मैं अपने जे एस फ़ाइलों में aspx पेज के आईडी संदर्भित कर सकते हैं है।

क्या कोई इस तरह से काम करने में कोई कमी देख सकता है? मैंने केवल बाहरी जेएस फाइलों का उपयोग करना शुरू कर दिया है। सबकुछ UserControl में ही लिखा गया था।

+0

कि मेरी राय में वास्तव में लग रहा है – ichiban

+1

यकीन है कि स्क्रिप्ट तत्व के टैग में नहीं हैं अपने .js फ़ाइल - वे HTML हैं, जावास्क्रिप्ट नहीं। – Anonymous

+0

हां, जेनरेट कोड HTML आउटपुट –

उत्तर

1

ठीक है, विधि केवल प्रत्येक पृष्ठ में एक बार उपयोग की जा सकती है, इसलिए यदि आप इसे उपयोगकर्ता नियंत्रण से कॉल कर रहे हैं जिसका अर्थ है कि आप कभी भी उसी उपयोगकर्ता पर दो उपयोगकर्ता नियंत्रण नहीं डाल सकते हैं।

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

कुछ की तरह:

private const string _key = "ClientIDs"; 

public static void GenerateClientIDs(params WebControl[] controls) { 
    Page page = HttpContext.Current.Handler As Page; 
    List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>; 

    if (items == null) { 
     page.PreRender += RenderClientIDs; 
     items = new List<WebControl>(); 
    } 

    items.AddRange(controls); 

    HttpContext.Current.Items[_key] = items; 
} 

private static void RenderClientIDs() { 
    Page page = HttpContext.Current.Handler As Page; 
    List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>; 

    StringBuilder script = new StringBuilder(); 
    script.AppendLine("<script type=\"text/javascript\">"); 
    foreach (WebControl c in items) { 
     script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID)); 
    } 
    script.AppendLine("</script>"); 

    page.Head.Controls.Add(new LiteralControl(script)); 
} 
+0

में बहुत अच्छा है। धन्यवाद :-) –

1

इस चेक आउट: http://weblogs.asp.net/joewrobel/archive/2008/02/19/clientid-problem-in-external-javascript-files-solved.aspx

लग रहा है यह आप के लिए गंदे काम का ख्याल रखता है की तरह (Guffa के जवाब की तरह कुछ)। यह एक JSON ऑब्जेक्ट (example) सर्वर आईडी और ग्राहक आईडी युक्त उत्पन्न करता है, ताकि आप अपने जावास्क्रिप्ट में कुछ इस तरह कर सकते हैं:

var val = PageControls.txtUserName.value; 
संबंधित मुद्दे