2010-07-27 11 views
6

In ASP.Net habe ich ein paar benutzerdefinierte Steuerelemente, die ich gemacht habe. Ich benutzte jQuery, wo es auch half. Nun, ein Problem, das ich jetzt habe (mit offensichtlichen, aber "schlechten" Problemumgehungen) ist, dass ich für jedes Benutzersteuerelement Code innerhalb von pageLoad ausführen muss ($(document).ready funktioniert nicht mit Update-Panels).Die beste Art, JavaScript in benutzerdefinierten Steuerelementen zu behandeln?

Nun so, jetzt mein Problem. Ich muss zwei benutzerdefinierte Steuerelemente an das Ereignis pageLoad anhängen.

Was wäre der beste Weg, dies zu tun?

Ich kann nicht einfach tun

old_pageLoad=pageLoad 
pageLoad=function(){... old_pageLoad();} 

weil diese benutzerdefinierten Kontrollen mehr als einmal auf einer Seite verwendet werden können und das Skript muss für jede einzelne Instanz der Kontrolle laufen, und was ist, wenn ich hatte 3 verschiedene benutzerdefinierte Steuerelemente auf der Seite?

die einzige Methode, die ich habe kommen mit ist so etwas, das Super hackish scheint:

old_pageLoad_<%= MyStaticClass.GetUniqueID() %>=pageLoad; 
pageLoad=function(){... old_pageLoad_<%= MyStaticClass.GetUniqueID() %>();} 

Gibt es bessere Möglichkeiten, wie diese Funktion Umgang mit Konflikten?

Ich habe auch this MSDN article gesehen, aber was es vorschlägt, scheint mir schlimmer zu sein als das, was ich gerade mache.

Antwort

1

Verwenden Sie die RegisterStartupScript Methode der ScriptManager. Sie übergeben während der Registrierung des Skripts einen Verweis auf Ihr Steuerelement und stellen sicher, dass das Initialisierungsskript bei jeder Aktualisierung des Steuerelements ausgeführt wird (entweder beim ersten Laden der Seite oder beim Aktualisieren eines UpdatePanels).

+0

Ja, aber dann habe ich mein Javascript als Strings (in dem Code-Behind) zu behandeln, was bedeutet, dass keine Hervorhebung Syntax und Sie müssen entweder auf Zeichenfolge zurückgreifen concat oder String-Ersatz serverseitige Material – Earlz

+0

@Earlz einzufügen: Diese Deshalb legen Sie den Großteil Ihres Codes in eine externe .js-Datei und setzen nur einen einfachen Funktionsaufruf (möglicherweise mit steuerungsspezifischen Argumenten) in das Skript für RegisterStartupString. Ich verwende einen benutzerdefinierten JS-Schreiber, um die Argument-Strings zu erstellen, so dass ich mich nicht darum kümmern muss, zu entkommen und was nicht. –

+0

Ich versuche das schon zu tun, aber wenn ich den Wert von 10 verschiedenen Dingen lesen muss, sind 10 Argumente für eine Funktion ein bisschen lang. – Earlz

0

Eine andere Möglichkeit wäre, einen Handler hinzuzufügen, der eine JavaScript-Methode aufruft, wenn ein asynchrones Postback endet. Ich habe dies mehrmals gemacht, um jQuery-Dialoge neu zu initialisieren. Z.B.

$().ready(function() { 
    myInitMethod(); 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myInitMethod); 
}); 

function myInitMethod() } 
    // Init code 
} 
Verwandte Themen