2010-12-11 14 views
8

creé control de usuario ASP.NET con función javascript:funciones Javascript dentro de control de usuario ASP.NET

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="BingTranslator.Web.WebUserControl1" %> 
<script type="text/javascript"> 
    function example() { 
     alert('<%=ExampleButton.ClientID%>'); 
     return false; 
    } 
</script> 
<asp:Button ID="ExampleButton" runat="server" Text="Example"/> 

Quiero llamar a la función "ejemplo" cuando el usuario mueva el ratón al botón, por lo que añadió atributo para el botón :

ExampleButton.Attributes.Add("onmouseover", "example()"); 

Funciona bien, pero cuando necesito dos controles en la misma página, tengo un problema. ASP.NET genera código con dos funciones con el mismo nombre, lo que es falso:

<script type="text/javascript"> 
    function example() { 
     alert('TestControl1_ExampleButton'); 
     return false; 
    } 
</script> 
<input type="submit" name="TestControl1$ExampleButton" value="Example" id="TestControl1_ExampleButton" onmouseover="example()" /> 


<script type="text/javascript"> 
    function example() { 
     alert('TestControl2_ExampleButton'); 
     return false; 
    } 
</script> 
<input type="submit" name="TestControl2$ExampleButton" value="Example" id="TestControl2_ExampleButton" onmouseover="example()" /> 

Y siempre onmouseover de eventos en cualquier botón llamará segunda función. Puedo resolver este problema agregando el código del script de Java con el Id del cliente directamente para atriburte onmouseover.

ExampleButton.Attributes.Add("onmouseover", "[Here will be javascript code]"); 

Pero no es una solución muy armoniosa para mí. Aconseje, cómo puedo resolver mejor este problema.

P.S. Habrá mucho más código Javascript, agregué dos cuerdas superiores, por ejemplo.

Respuesta

7

Debe registrarse las secuencias de comandos con ClientScriptManager - de esta manera se pueden registrar una vez, independientemente de la frecuencia con el control ha sido añadido a la página:

// Get a ClientScriptManager reference from the Page class. 
ClientScriptManager cs = Page.ClientScript; 

// Check to see if the startup script is already registered. 
if (!cs.IsStartupScriptRegistered(cstype, csname1)) 
{ 
    String cstext1 = "alert('Hello World');"; 
    cs.RegisterStartupScript(cstype, csname1, cstext1, true); 
} 
+1

Sí, me tis una forma posible, pero no quieren mover código JavaScript en un archivo de CS debido a es un gran tamaño – Anton

+2

@Anton - Parece que necesita refactorizar su archivo CS. – Oded

8

Es necesario utilizar this.id

$(document).ready(function() { 
    load_v<%= this.ID %>  
}); 

function load_v<%= this.ID %>(fromclick) { 
    alert('anything'); 
} 

De modo que, incluso si necesita dos o más controles iguales en la misma página, tendrán diferentes identificaciones. Espero que esto ayude! aplausos :)

+0

Pero esto creará muchas funciones Javascript idénticas de todos modos, y eso es lo que se debe evitar. Además, supongo que en el evento 'listo' querías escribir' load_v <% = this.ID%>() ', ¿verdad? ¿Y para qué sirve 'fromclick'? – Andrew

20

he encontrado una solución en otro sitio que le permite utilizar un archivo externo

if (!Page.ClientScript.IsClientScriptIncludeRegistered("key")) 

{ 

    string url = ResolveClientUrl("~/Scripts/file.js"); 

    Page.ClientScript.RegisterClientScriptInclude("key", url); 

} 
+3

¿Por qué no es esta la solución aceptada? Eres un salvador de vida: D – tfrascaroli

Cuestiones relacionadas