2009-05-10 3 views
6

Ich weiß, dass dies schon einmal gefragt wurde, aber ich habe eine andere Möglichkeit gefunden, Verweise auf Steuerelemente in externen JS-Dateien zu bekommen, aber ich bin nicht sicher, wie dies in Bezug auf die Gesamtgeschwindigkeit sinken würde.Gibt es eine bessere Möglichkeit, ClientIDs in externe JS-Dateien zu bekommen?

Mein Code ist

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()); 
     } 
    } 

Das war ich die ID der aspx Seite in meinen JS-Dateien verweisen kann.

Kann jemand irgendwelche Nachteile sehen, um Dinge auf diese Weise zu tun? Ich habe erst begonnen, externe JS-Dateien zu verwenden. Bevor alles in das UserControl geschrieben wurde.

+0

Das ist wirklich meiner Meinung nach sieht – ichiban

+1

Achten Sie darauf, die Tags der Script-Element nicht in Ihrem .js-Datei - das sind HTML, kein Javascript. – Anonymous

+0

ja, der generierte Code geht in die HTML-Ausgabe –

Antwort

1

Nun, die Methode kann nur einmal auf jeder Seite verwendet werden. Wenn Sie sie also über ein Benutzersteuerelement aufrufen, können Sie nie zwei dieser Steuerelemente auf derselben Seite platzieren.

Sie können die Kontrollverweise in einer Liste bis zum PreRender-Ereignis speichern und dann alle in ein Skript-Tag im Seitenkopf einfügen. Auf diese Weise können Sie die Methode mehrmals aufrufen, und alle Client-IDs werden in dasselbe Skript-Tag eingefügt.

Etwas wie:

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

Sehr schön. Vielen Dank :-) –

Verwandte Themen