Christian S.: objekt-literale und schnittstellen-vererbung

Beitrag lesen

Hi,

zeig mal etwas mehr code ... so in die richtung *ausgangsbasis
   versus gewuenschtes verhalten* - vielleicht gibt es noch ganz
   andere loesungsansaetze.

in ASP.NET gibt es ja Servercontrols, also halt zB eine Textbox. Und UserControls, die aus mehreren Controls bestehen und woanders eingebunden werden (auch öfters) und zusammen eine logische Einheit bilden. Bestimmte Controls (solche, die in formularen verwendet werden, <input>, <select>, ...) möchte ich clientseitig einfach zugreifbar machen.
ASP.NET erzeugt ja immer eine ClientID, die uU ziemlich lang sein kann.
wenn ich also an die Textbox XY rankommen will müsste ich schreiben:

var textbox = document.getElementById('<%= txtBla.ClientID %>');

bei verschachtelten UserControls dann mit <%= UserControl1.FindControl("Textbox1").ClientID %>.

Weiterhin suche ich nach einer Möglichkeit zB alle Formularelemente eines Usercontrols zu resetten oder zu disablen.

Möchte ich alle Elemente eines UserControls resetten hab ich bisher geschrieben:

var textbox1 = document.getElementById('<%= txtBla.ClientID %>');
var textbox2 = document.getElementById('<%= txtBla.ClientID %>');
var textbox3 = document.getElementById('<%= txtBla.ClientID %>');
var textbox4 = document.getElementById('<%= txtBla.ClientID %>');

textbox1.value = "";
usw....

beim disablen analog.

Das ist ziemlich nervig...

Idee: Ich gehe serverseitig alle Controls der Seite rekursiv durch und baue mir ein JavaScript Objekt zusammen, welches ich an die Seite mit rausrendere. Die Struktur ist dabei die selbe wie serverseitig.

statt

var textbox = document.getElementById('<%= txtBla.ClientID %>');
textbox.disabled = true;

habe ich direkt die Textbox mit ihrer (serverseitigen) ID als globale Variable und könnte so drauf zugreifen:

txtBla.disabled = true;

UserControls sollen als Unterobjekte dargestellt werden:

UserControl1.txtMyTextbox.disabled = true;

(die ClientID setzt sich ähnlich zusammen: Usercontrol1_txtMyTextbox)
(Man könnte ja die selbe server ID für verschiedene Element in verschiedenen Usercontrols verwenden).

Serverseitig geh ich also alles rekusriv durch und gebe aus:

var txtBla = document.getElementById(...);

Bei den UserControls brauch ich dann eben Objekte.

var UserControl1 =
{
   txtBla: document.getElementById(...),
   txt1: ...,
   InnerUserControl: {...}
};

Jedes Usercontrol soll also ein paar Methoden von einer Basisklasse erben. Zum disablen geh ich also alle properties (for(var control in this)) durch und setze sie auf disabled (wenn das member ein object ist).

Damit hab ich obiges Problem sehr vereinfacht.

Natürlich könnte ich auch serverseitig einen Konstruktor für jedes UserControl generieren lassen und dann halt eine (die einzige) Instanz davon erzeugen, aber das find ich halt nicht so schön, da man ja eigentlich keinen Konstruktor braucht, da eh nur eine Instanz existiert.

Gruß
Christian