Thomas Bandt

Über mich | Kontakt | Archiv

Lösungen für "WebControls überschreiben oder verdecken"

Für mein Problem mit den WebControls bin ich nun auf ein paar Lösungen gestoßen.

Möglichkeit 1:

Man behält die Basisklasse bei und holt sich via LoadControl das entsprechende WebControl aus dem Parent-Objekt, also dem Template. Nicht sehr schön.

Möglichkeit 2:

Man behält die Vorgehensweise wie in ASP.NET 1.1 bei, d.h. man bindet das CodeBehind-File weiterhin via src- anstatt über CodeFile-Attirbut an das WebForm und übernimmt die Deklaration selbst. Wohl die einfachste Lösung, aber eben auch nicht wirklich befriedigend - denn wenn schon ASP.NET 2.0 dann komplett und ohne irgendwelche Altlasten. Spätestens bei 3.0 würde man da dann wahrscheinlich sowieso drüber stolpern.

Möglichkeit 3:

Man gibt dem Template Methoden zum Füllen der Controls, und erledigt das Ganze "von oben" dann via Reflection:

public class TemplateParser : System.Web.UI.UserControl
{
protected override void OnInit(EventArgs e)
{
MethodInfo mSetHeadline = this.GetType().GetMethod("SetHeadline");
if (mSetHeadline != null){
mSetHeadline.Invoke(this, new string[]{"Überschrift"});
}
}
}

Möglichkeit 4:

Man verwendet Interfaces. Diese Methode erfordert zwar im Template Methoden zum eigentlichen Setzen der Eigenschaften der WebControls usw., bietet dafür aber absolute Typsicherheit an. Ist das Interface vom Template implementiert, wird das entsprechend zugehörige Control befüllt, wenn nicht, dann passiert halt nichts.

Ich habe zuerst mehr aus Anwendersicht gedacht und wollte eine Quick&Dirty Lösung, in der ich im WebForm einfach Controls einfügen oder löschen kann - aber ehrlich gesagt geht über die Bequemlichkeit eindeutig die Stabilität und Sicherheit. D.h. wer nun die Templates bearbeiten will oder muss, braucht zumindest Grundkenntnisse in der tiefergehenden Programmierung, aber ein Zugriff auf das eigentliche CodeBehindFile ist zum Beispiel nicht notwendig. Denn in ASP.NET 2.0 lassen sich Interfaces auch im WebForm implementieren und die entsprechenden Methoden zum Befüllen natürlich auch bereithalten.

Lange Rede, hier ein Codebeispiel:

default.aspx:
--------------------------------------------------------------------
"Content"
runat="server" />



default.aspx.cs
--------------------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
TemplateParser Article = (TemplateParser)Page.LoadControl("WebUserControl.ascx");
Content.Controls.Add(Article);
}



webusercontrol.ascx (Template)
--------------------------------------------------------------------
"Headline" runat="server" />



webusercontrol.ascx.cs
--------------------------------------------------------------------
public partial class WebUserControl : TemplateParser, ISetHeadline
{
public void SetHeadline(string headline)
{
Headline.Text = headline;
}
}



ITemplateParser.cs
--------------------------------------------------------------------
public interface ISetHeadline
{
void SetHeadline(string headline);
}



TemplateParser.cs
--------------------------------------------------------------------
public class TemplateParser : System.Web.UI.UserControl
{
protected override void OnInit(EventArgs e)
{
ISetHeadline headline = this as ISetHeadline;

if (headline != null)
{
headline.SetHeadline("Überschrift");
}
}
}

Der Dank geht dabei an alle die mir Tipps und Denkanstöße gegeben haben, insbesondere aber geht er an Günter Prossliner.



« Zurück  |  Weiter »