cool IT Team-Blog

Dynamischer Aufbau von ASPX-Seiten


Gerade beim Design von Intranet-Applikationen, die bestimmte Datenbestände verwalten sollen, steht man als Entwickler immer wieder vor dem Problem, dass viele Formulare immer wieder das gleiche Verhalten auf verschiedene Daten aufweisen sollen, ob es nun Suchmasken, Masken zum Anlegen oder zum Bearbeiten von Objekten sind. Die Funktionen "Neu", "Bearbeiten", "Löschen" sind bis auf die Tatsache, dass andere Daten geschrieben werden immer die gleichen. Auch das nachträgliche Einbringen von neuen Feldern auf eine Maske, wenn eine Applikation bereits im Produktiv-Einsatz ist erfordern dann auch immer einen Eingriff in den Code und ein erneutes Deployment.

Eine Möglichkeit diese Tatsache zu umgehen ist es sämtliche Felder, die auf einer Maske vorhanden sein sollen dynamisch zur Laufzeit zu erzeugen. Die Beschreibung der Felder einer Maske kann z.B. in eine XML-Datei ausgelagert werden. Die XML-Datei enthält dann unter anderem die Informationen:
  • ID eines Feldes
  • Label-Text
  • Art des Conrols (TextBox, DropDownList, etc.)

Eine mögliche XML-Struktur könnte stark vereinfacht in etwa so aussehen:
<?xml version="1.0" encoding="utf-8"?>
<UI xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance">
  <Field id="id" DisplayName="ID" DisplayType="string" />
  <Field id="vorname" DisplayName="Vorname" DisplayType="string" />
  <Field id="nachname" DisplayName="Nachname" DisplayType="string" />
  <Field id="abteilung" DisplayName="Nachname" DisplayType="list" />
</UI>


Was jetzt nötig ist, um diese Controls dynamisch zu erzeugen ist ein Control, das als Container dient. Am besten geeignet dafür hat sich das ASP-Panel erwiesen, da es beim Rendern ein DIV erzeugt, was beim Layouten der Seite von Vorteil ist. Prinzipiell kann aber jedes beliebige Control als Container erwendet werden, auch die Seite selbst.

Das Einfügen der Controls passiert dann beim Laden der Seite. Mittels einer Schleife über alle Field-Elemente wird zunächst für jedes Feld ein Label erzeugt, dessen Text den DisplayName des Feldes entspricht.
Label l = new Label();
l.Text = field.DisplayName;


Je nach Art (DisplayType) des Feldes wir dann das korrekte Control erzeugt. Beispiel für eine TextBox:
TextBox t = new TextBox();

Um das dynamisch erzeugt Formular leichter Layouten zu können, is es sinnvoll alle erzeugten Controls mit CSS-Klassen zu versorgen.
l.CssClass = "dynLabel";
t.CssClass = "dynField";


Zum Abschluss müssen die Controls dann in den Container eingehängt werden:
container.Controls.Add(l);
container.Controls.Add(t);


Um jetzt bei Controls, wie zum Beispiel der TextBox die Eingaben des Benutzers abzufragen, muss einfach das Control in der Page gesucht werden, was wie in folgendem Beispiel funktioniert.
Control c = Page.FindControl(field_id);
if (c is TextBox) {
   TextBox t = (c as TextBox)
   return t.Text;
}


Sämtliche Möglichkeiten, die einem die ASPX-Controls erlauben können über das Objekt-Modell zugegriffen werden. Für Pflichtfelder die Client-Seitig validiert werden sollen können die Validator-Controls dynamisch angehängt werden, AJAX-Scripts können dynamisch erzeugt und angebunden werden - alles gesteuert über eine XML-Datei, die zur Laufzeit der Applikation zum Erzeugen des Formulars verwendet wird.

Ist doch cool, oder?
Verfasst: 26.08.2010 11:20:59 von Robert Stefan
Tags: add control, aspx, dynamisch, page aufbau

1


Kommentare
Für diesen Blogbeitrag liegen zurzeit keine Kommentare vor.
Einen Kommentar schreiben



 Security code