2010-12-11 16 views
8

ho creato controllo utente ASP.NET con funzione javascript:funzioni Javascript all'interno ASP.NET controllo utente

<%@ 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"/> 

voglio chiamare la funzione "esempio" quando l'utente movimento del mouse a pulsante, così ho aggiunto l'attributo per il tasto :

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

funziona bene, ma quando ho bisogno di due controlli sulla stessa pagina ho ottenuto un problema. ASP.NET genera codice con due funzioni con lo stesso nome, ciò che è sbagliato:

<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()" /> 

E sempre onmouseover eventi su qualsiasi pulsante chiamerà seconda funzione. Sono in grado di risolvere questo problema aggiungendo il codice di script java con ID client direttamente per attribuire a onmouseover.

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

Ma per me non è una soluzione molto armoniosa. Si prega di avvisare, come posso risolvere meglio tale problema.

P.S. Ci sarà molto più codice Javascript, ho aggiunto due tomaie solo per esempio.

risposta

7

È necessario registrare i propri script con ClientScriptManager - questo modo possono essere registrati una sola volta, indipendentemente da quante volte il controllo è stato aggiunto alla pagina:

// 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ì, ho tis una possibile via, ma io non voglio spostare codice javascript in file di CS a causa di è enorme. – Anton

+2

@Anton - Suona come avete bisogno di refactoring il file CS. – Oded

8

È necessario utilizzare this.id

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

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

Così, anche se occorrono due o più controlli uguali nella stessa pagina, avranno ID diversi. Spero che questo aiuti! acclamazioni :)

+0

Ma questo creerà molte funzioni Javascript identiche in ogni caso, ed è quello che dovrebbe essere evitato. Inoltre, suppongo che nell'evento 'ready' volessi scrivere' load_v <% = this.ID%>() ', giusto? E cosa significa "da clic"? – Andrew

20

ho trovato una soluzione in un altro sito, che permette di utilizzare file esterno

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

{ 

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

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

} 
+3

Perché questa non è la soluzione accettata? Sei un salvatore: D – tfrascaroli

Problemi correlati