Markup von WebServer Controls fest im Griff

ASP.Net WebServerControls sind .Net KlassenASP_Net_Web_Controls, die sowohl über den ASP.Net Markup als auch über den C# oder Visual Basic Code eines übergeordneten Controls oder eine Page erstellt werden können.

Die Vielzahl der selbst entwickelten WebServerControls werden im ServerCode instanziiert, wodurch oftmals nur wenig Aufwand in die Korrektheit der Markup Instanziierung investiert wird.

Das .Net Framework bietet dem ASP.Net Entwickler dabei jedoch viele Möglichkeiten den Markupsyntax für eigene Controls zu individualisieren und leicht verständlich bzw. lesbarer zu machen.

Bei ASP.Net WebServerControls wird dabei fast ausschließlich von Attributen Gebrauch gemacht. Dementsprechend einfach ist es vorhandene Controls zu erweitern beziehungsweise zu überarbeiten.

Das ToolBoxData Attribut

Das wohl bekannteste Attribut auf Ebene der WebControl-Klasse ist das ToolBoxData-Attribut. Mit diesem Attribut wird angegeben wie eine konkrete Instanz dieses Controls im Markup repräsentiert wird wenn es aus der ToolBox auf das Designsurface oder in den Markup gedropt wird. Dem Attribut wird als Parameter eine String Maske übergeben, die über einen Möglichen Parameter {0} verfügt. Mit diesem Parameter wird im Markup das TagPrefix des Controls gerendert

[ToolBoxData("<{0}:MyBlogEntry runat=server></{0}:MyBlogEntry>")]

wird im Markup zu

<myPrefix:MyBlogEntry runat="server"></myPrefix:MyBlogEntry>

 

Attribute auf Property-Ebene

Um ein sauberes Markup zu erstellen, muss natürlich mehr als nur das ToolBoxData Attribut definiert werden. Hier folgen einige Attribute auf PropertyEbene die man kennen sollte.

Das EditorBrowsable Attribut

Mit dem EditorBrowsable Attribut kann man gezielt einzelne Eigenschaften des WebServerControls aus dem IntelliSense für den Markup entfernen. Dadurch können optionale Properties versteckt werden.

 

Das UrlProperty Attribut

Oft und gerne verwendet, allerdings nur von den wenigsten Entwickler selbst verwendet ist das UrlProperty Attribut. mit Hilfe des UrlProperty Attributes kann man schnell und einfach eine IntelliSense-DropDown im MarkupEditor von VisualStudio aktivieren, durch die der Entwickler eine Url als Wert für die Property auswählen kann.

MarkupIntelliSense 

Das Filterable Attribut

Mit dem Filterable Attribut wird angegeben, dass der Wert der Eigenschaft für unterschiedliche Browser angegeben werden kann. Die ASP.Net Runtime entscheidet dann beim Rendering welchen Wert sie verwendet.

 

Das PersistenceMode Attribut

Das PersistenceMode Attribut ist wohl eines der meist gewünschten aber dennoch am seltensten verwendeten Attribute die hier genannt werden. Mit dem PersistenceMode Attribut kann durch Angabe des entsprechenden Enumerationswertes eingestellt werden wie die aktuelle Property im Markup des WebServerControls gerendert werden soll. Neben dem Standardwert "PersistenceMode.Attribute” ist hier noch der Enumerationswert “InnerDefaultProperty” sehr interessant.

PersistenceMode.InnerDefaultProperty

Die Property wird als InnerText des WebServerControl-Tags angegeben.

<Autor ID="autor1" runat="server" 
    Email="thorsten.hans@gmail.com"
    Website="http://dotnet-forum.de/blogs/thorstenhans/">
      Hier ist die Propery</Autor>

 

Sobald es sich bei der Property um einen komplexen Datentyp handelt, der als inneres Tag des ServerControls gerendert werden soll, reicht das PersistenceMode Attribut nicht mehr aus, in diesem Fall muss das Attribut DesignerSerializationVisibility angegeben werden. Durch setzen des Wertes DesignerSerializationVisibility.Content, wird die Markup Repräsentation des komplexen Types als Inhalt in das Markup des WebServerControls gerendert. Das zuvor gezeigte Markup für einen Autor kann so zum Beispiel in einen Blogeintrag eingebettet werden

<th:BlogEntry Title="Challenging ASP.Net WebServer Controls" 
        Content="This is a sample blog entry, 
        which shows some tips for asp.net developers" 
        runat="server" ID="blogEntry1">
   <Autor ID="autor1" runat="server" 
        Email="thorsten.hans@gmail.com"
        Website="http://dotnet-forum.de/blogs/thorstenhans/">
        Hier ist die Name Property
   </Autor>
</th:BlogEntry>

 

Darstellen von 1:n Beziehungen

Oftmals gibt es Fälle in denen ein ServerControl eine undefinierte Menge an Kindelementen vom gleichen Typ hat. Wie zum Beispiel der klassische Wizard. Der Wizard ist das WebServerControl, welches beliebig viele Control Elemente als WizardSteps beinhalten kann. Auch solche Dinge sind leicht mit Attributen zu lösen.

Neben dem bereits erwähnten DesignerSerializationVisibility Attribut ist die einzige Bedingung für die Lösung dieses Problems, dass das Host-WebServerControl (in diesem Fall Wizard) mit dem ParseChildren Attribut dekoriert werden muss.

 

Das ParseChildren Attribut

ParseChildren verfügt über zwei Parameter, zum einen ein boolsches Flag, welches angibt ob Kindelemente verarbeitet werden sollen oder nicht. Des Weiteren verfügt das Attribut noch über einen zweiten Parameter vom Typ String, mit diesem Parameter gibt man den Namen der Property an die geparst werden soll.

[ParseChildren(true,"WizardSteps")]

Der Markup des Wizard Controls sieht demach in gekürzter Version wie folgt aus

<Wizard>
  <Step />
  <Step />
  <Step />
</Wizard>

 

Fazit

Durch die Verwendung von einfachen Attributen kann auch der oft vernachlässigte Markup von ASP.Net WebServerControls eine Erfrischungskur bekommen, ohne dass der Entwickler einen großen Aufwand betreiben muss.

 

Published Samstag, 29. August 2009 00:22 von ThorstenHans
Abgelegt unter: , , ,

Kommentare

# re: Markup von WebServer Controls fest im Griff

Samstag, 29. August 2009 20:27 von Daniel Lindemann

servercontrol attribute hmm muss ich direkt mal ausprobieren

sind bestimmt bei einigen lösungsansätzen sehr hilfreich :)

gruß

daniel

Kommentar abgeben

(verpflichtend) 
(verpflichtend) 
(optional)
(verpflichtend)