Glengamoi · AspHeute (Artikel) · .NET Heute (RSS-Suche) · .NET Blogs · Glengamoi Suche (Installieren via Klick)

Glengamoi

Die Diskussionsforen der deutschen .NET Community
Willkommen bei Glengamoi. Anmeldung | Registrieren | Hilfe
in Suchen

Control.ClientID falsch

Letzter Beitrag 02-13-2007 15:21 von Claudius Ceteras. 3 Antworten.
Seite 1 von 1 (4 Treffer)
Beiträge sortieren: Zurück Weiter
  • 02-13-2007 13:42

    Control.ClientID falsch

    hallo,

     wie kann es sein, dass Control.ClientID nicht immer die korrekte id zurückliefert, welche von asp.net generiert wird?

    in einem asp.net-formular generiere ich u.a. dynamisch textboxen.
    um später beim absenden des formulars an die inhalte der dynamischen textboxen zu kommen, muss ich mir also beim erzeugen (asp.net 2.0 name mangling sei dank!) die ClientID der textboxen merken.

    erwartungsgemäß macht asp.net aus z.b. meiner textbox mit id "TextBox1" folgendes:
    <input name="ctl00$ContentPlaceHolderMenu$TextBox1" type="text" id="ctl00_ContentPlaceHolderMenu_TextBox1" />

    beim anlegen der texbox liefert box.ClientID aber nicht die ID zurück, wie sie im html-quelltext erscheint (s.o.), sondern merkwürdigerweise die "not-mangled"-ID:

    string mangledName = box.ClientID;     // liefert "Text1", nicht "ctl00_ContentPlaceHolderMenu_TextBox1" ?!

     und aufgrund dieser falschen id kann ich natürlich später beim absenden nicht mehr mit:

    TextBox box = (TextBox)FindControl(mangledName);

    darauf zugreifen.

    An anderer Stelle (statische controls) funktioniert dieser workaround hingegen.

     

    • IP-Adresse ist Registriert
  • 02-13-2007 13:56 Antwort zu

    RE: Control.ClientID falsch

    > in einem asp.net-formular generiere ich u.a. dynamisch textboxen.
    > um später beim absenden des formulars an die inhalte der
    > dynamischen textboxen zu kommen, muss ich mir also beim
    > erzeugen (asp.net 2.0 name mangling sei dank!) die ClientID
    > der textboxen merken.

    http://devsushi.com/2006/08/27/aspnet-dynamic-control-creation-part-1/


    Claudius
    • IP-Adresse ist Nicht registriert
  • 02-13-2007 14:23 Antwort zu

    AW: RE: Control.ClientID falsch

    danke für den link.

    habe das eigentliche problem inzwischen behoben, hier die lösung:
    control.ClientID liefert die korrekte ASP.Net-ID erst nachdem das control auch der seite hinzugefügt wurde, ich hatte es schon direkt beim anlegen der textbox versucht. nach dem hinzufügen der textbox mit Controls.Add(), erhalte ich nun die korrekte "mangled-id". macht ja auch irgendwie sinn :)

    allerdings gibt es nun wiederum das nächste problem: FindControl() findet trotz korrekter id das control nicht.
    habe schon eine rekursive funktion benutzt (http://west-wind.com/WebLog/posts/5127.aspx), da FindControl (warum auch immer?!) nicht rekursiv arbeitet und somit child controls nicht berücksichtigt. die "grey-hair-risk" ist wirklich beachtlich

     gibt es eigentlich wirklich keine möglichkeit, dieses nervtötende name mangling auszuschalten?
    all die probleme und daher nötigen workarounds bei der ajax-programmierung sind es doch nicht wert, man verliert immer mehr die struktur und die saubere trennung der schichten. man kann als programmierer doch wohl selbst aufpassen, dass man nicht die gleiche control id mehrfach vergibt.

    • IP-Adresse ist Registriert
  • 02-13-2007 15:21 Antwort zu

    RE: AW: RE: Control.ClientID falsch

    > gibt es eigentlich wirklich keine möglichkeit, dieses
    > nervtötende name mangling auszuschalten?
    > all die probleme und daher nötigen workarounds bei der
    > ajax-programmierung sind es doch nicht wert, man verliert
    > immer mehr die struktur und die saubere trennung der
    > schichten. man kann als programmierer doch wohl selbst
    > aufpassen, dass man nicht die gleiche control id mehrfach vergibt.

    Wenn Du wiederverwendbare Controls haben möchtest eben nicht. Die Gefahr ist
    zu gross, dass es Unter-Controls mit gleichem Namen gibt.

    Was Dein FindControl-Problem angeht: Bist Du sicher, dass Du Deine Controls
    jedesmal anlegst? Und bist Du sicher, dass Dein FindControl in einem Event
    läuft, der vor dem einfügen passiert?
    Eigentlich kannst Du Dir das Absuchen ersparen, da Du beim Anlegen Dir die
    nötigen Controls auch zusätzlich in eine eigene Collection, z.B. ArrayList
    oder ner entsprechenden generischen Collection packen kannst und dann direkt
    Zugriff drauf hast.
    Ansonsten hoffe ich Du hast den vierteiligen Artikel gelesen...


    Claudius
    • IP-Adresse ist Nicht registriert
Seite 1 von 1 (4 Treffer)