2010-12-11 12 views
8

I utworzone kontroli użytkownika ASP.NET z funkcji javascript:Javascript funkcje wewnątrz ASP.NET kontroli użytkownika

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

chcę zadzwonić „przykład” funkcji, gdy użytkownik ruch myszy przycisk, aby, tak I dodaje atrybut dla przycisku :

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

Działa dobrze, ale kiedy potrzebuję dwóch kontroli na tej samej stronie, mam problem. ASP.NET generuje kod z dwóch funkcji o tej samej nazwie, co jest nie tak:

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

I zawsze onmouseover zdarzeń na dowolny przycisk wezwie drugą funkcję. Jestem w stanie rozwiązać ten problem poprzez dodanie kodu skryptu java z Id klienta bezpośrednio do attriburte onmouseover.

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

Ale to nie jest bardzo harmonijne rozwiązanie, jak dla mnie. Proszę doradzić, jak mogę lepiej rozwiązać ten problem.

P.S. Będzie o wiele więcej kodu Javascript, dodałem na przykład dwa łańcuchy górne.

Odpowiedz

7

Musisz zarejestrować swoje skrypty z ClientScriptManager - w ten sposób mogą być zarejestrowany raz, niezależnie od tego, jak często kontrola została dodana do strony:

// 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

Tak, ja tis możliwy sposób, ale nie chcę, aby przejść do pliku kod javascript CS powodu to ogromny rozmiar. – Anton

+2

@Anton - Brzmi jak trzeba byłaby plik CS. – Oded

8

Trzeba użyć this.id

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

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

tak, że nawet jeśli potrzebne są dwa lub więcej takich samych elementów sterujących w tej samej strony będą miały różne identyfikatory. Mam nadzieję, że to pomoże! Cheers :)

+0

Ale to stworzy wiele identyczne funkcje Javascript mimo to, i to, co powinno się unikać. Także myślę, że w 'ready' przypadku chciałeś napisać' load_v <% = this.ID%>() ', prawda? I po co to jest "od"? – Andrew

20

znalazłem rozwiązanie w innym miejscu, które pozwala korzystać z zewnętrznego pliku

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

{ 

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

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

} 
+3

Dlaczego nie jest to przyjętego rozwiązania? Jesteś zbawicielem życia: D – tfrascaroli

Powiązane problemy