2009-05-10 8 views
6

Sé que esto se ha preguntado antes, pero he encontrado una forma diferente de obtener referencias a los controles en archivos JS externos, pero no estoy seguro de cómo se reduciría en términos de velocidad general.¿Existe alguna forma mejor de obtener ClientID en archivos JS externos?

Mi código es

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

Esto fue lo que puedo hacer referencia a la identificación de la página aspx en mis archivos JS.

¿Alguien puede ver los inconvenientes de hacer las cosas de esta manera? Solo comencé a usar archivos JS externos. Antes de que todo estuviera escrito en el UserControl mismo.

+0

que se ve muy en mi opinión – ichiban

+1

Asegúrese de que las etiquetas del elemento de script no están en su archivo .js: son HTML, no Javascript. – Anonymous

+0

sí, el código generado va a la salida HTML –

Respuesta

1

Bueno, el método solo se puede usar una vez en cada página, por lo que si lo llamas desde un control de usuario significa que nunca puedes poner dos de esos controles de usuario en la misma página.

Puede almacenar las referencias de control en una lista hasta el evento PreRender, luego colocarlas todas en una etiqueta de script en el encabezado de la página. De esta forma, puede llamar al método más de una vez, y todos los ID de cliente se colocan en la misma etiqueta de secuencia de comandos.

Algo así como:

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

Muy bonito. Gracias :-) –

Cuestiones relacionadas