Laden...

AJAX: $get() liefert immer null

Erstellt von Urbain vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.980 Views
Urbain Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren
AJAX: $get() liefert immer null

Hey,

ich verwende in einer JavaScript-Datei $get um mir den Verweis eines Steuelements zu holen. Das klappte bis jetzt super. Ich habe nun allerdings eine MasterPage erstellt und nun liefert $get immer null. Die JavaScript-Datei ist mit einer ContentPage verknüpft und ich versuche mir auch einen Verweis eines Controls auf dieser ContentPage zu holen. Ich greife also nicht auf die MasterPage zu. Der ScriptManager befindet sich aber auf der MasterPage.

Als ich noch keine MasterPage hatte, konnte ich direkt mit $get die serverseite ID eines Steuerelements angeben, wie ich sie auch im Markup festgelegt habe, nun muss ich aber die komplette ClientID angeben, damit ich einen Verweis bekomme. Gut, dachte ich mir ich verwende Data Binding Expressions, aber ich bekomme es einfach nicht gebacken die ID an meine JavaScript-Function zu übergeben.
Im CodeBehind ist das kein Problem, aber wie macht man das im Markup?

Ich verwende das so:

OnClientClick="return ConfirmSave('<%= Control.ClientID %>')"

Es wird immer die Zeichenkette <%= Control.ClientID %> übergeben.

Ein weiteres Problem das sich ergibt ist, wie ich zur ClientID komme, wenn ich keinen Parameter übergeben kann. Das war früher eben kein Problem, weil ich nicht die ClientID mit $get verwenden musste, sondern die Angabe der serverseitigen ID gepasst hat.
Das macht es mir schwer im JavaScript auf die von Server gerenderten Controls zuzugreifen, weil ich die ID von denen nicht herausfinden kann.

Ich hab gesucht, aber weder in meinem Buch, noch in der MSDN was gefunden, wann verwende ich <%#, wann <%= und wann <%$? Immer wenn man im Zusammenhang mit Data Binding Expressions suche, wird immer die Raute genommen und nicht das Gleichheits- oder Dollarzeichen. Wo liegt der Unterschied?

Danke für eure Zeit.

EDIT: Ich habe gerade gelesen, dass $get nur eine kürzere Form von document.getElementById ist. Also wird es wohl so sein, dass sich, die serverseitige ID des gerenderten Controls vor dem Verwenden der MasterPage nicht geändert hat, also auch auf der Clientseite verwendet wurde. Und ich hab gedacht, es sei eine Besonderheit von $get, dass man eben auch die serverseitige ID angeben kann. Ist anscheinend nicht so 😃
Aber das Problem besteht weiterhin. Wie spreche ich die serverseitigen Controls aus einer separaten JavaScript-Datei aus an, bzw. wie verwende ich die Datenbindungsausdrücke richtig, sodass ich die ClientID als Parameter an eine Function übergeben kann?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

wenn Du solche Ausdrücke verwenden willst, muss der ganze Attributwert als Ausdruck dargestellt werden. Du kannst nicht literale un Datenbindungsausdrücke in einem Attributwert mischen.
Also statt

OnClientClick="return ConfirmSave('<%= Control.ClientID %>')"

sowas:

OnClientClick='<%= "return ConfirmSave(" + Control.ClientID + ")" %>'

Achte darauf, wie die ' und " gesetzt sind, sonst gibt's ne Fehlermeldung.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Urbain Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Hallo,
...statt

OnClientClick="return ConfirmSave('<%= Control.ClientID %>')"  

sowas:

OnClientClick='<%= "return ConfirmSave(" + Control.ClientID + ")" %>'  

Achte darauf, wie die ' und " gesetzt sind, sonst gibt's ne Fehlermeldung.

Gruß, MarsStein

Hey MarsStein,
diese Lösung funktioniert leider nicht. Die Zeichenkette wird verändert. Im Quelltext steht später das drin:

onclick="&lt;%= &quot;return ConfirmSaveNumbers(&quot; + lstValues.ClientID + &quot;)&quot; %>;"

Und wie greife ich innerhalb meiner JavaScript-Datei auf die Controls zu, bzw. wie finde ich deren ID heraus?

1.433 Beiträge seit 2006
vor 13 Jahren

Vielleicht hilft Dir das hier ein wenig weiter.

Ich selber vewende zu 80% immer $find, da ich auch schon an Dein Problem gestossen bin. Mittlerweile verwende ich JQuery zum finden der Controls.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo Urbain,

sorry, falsches Tag, so wird richtig ersetzt (mit %# statt %=

OnClientClick='<%# "return ConfirmSave(" + Control.ClientID + ")" %>'

allerdings bekommst Du dann das Problem, daß Du ja den übergebenen Wert noch in Hochkommata einschließen willst, und wenn man die noch einfügt nörgelt er die Formatierung an.
Lösung: Ein Property im CodeBehind:

  protected string FormatString 
  {
    get { return "return ConfirmSave('{0}')"; }
  }

und in der aspx dann

OnClientClick='<%# String.Format(FormatString, Control.ClientID) %>'

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Urbain Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

...Mittlerweile verwende ich JQuery zum finden der Controls.

Oh, jQuery wollte ich mir schon seit Ewigkeiten ansehen. Hab ich noch nie gemacht, werde aber mal drüberschauen. Steht ganz weit oben in meiner todo-List 😃

@ MarsStein

Nun funktionierts, danke. Aber wenn man das so löst indem man die ClientID als Parameter an die Funktion übergibt, kann ich immer nur mit einem Steuerelement im JavaScript arbeiten. Was is aber wenn ich beispielsweise diese zwei Callbacks folgendermaßen registriere:


function pageLoad() {
    var pageManager = Sys.WebForms.PageRequestManager.getInstance();
    pageManager.add_beginRequest(BeginRequest);
    pageManager.add_endRequest(EndRequest);
}

Dann kann ich keine Parameter an die Methode übergeben. Wie komme ich dann beispielsweise in der Methode BeginRequest zu den Verweisen auf meine Steuerelemente?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

in dem Fall musst Du wohl mit dem auskommen müssen, was Dir in den Sys.WebForms.BeginRequestEventArgs übergeben wird.
Da steckt aber eigentlich alles Nötige drin.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Urbain Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Hallo,

in dem Fall musst Du wohl mit dem auskommen müssen, was Dir in den
>
übergeben wird.
Da steckt aber eigentlich alles Nötige drin.

Gruß, MarsStein

Okay, dann schau ich mir mal diese Klasse an. Danke für eure Hilfe.