ControlTemplate in C# per ASP.NET
Per creare un server control C# che supporta i template o ControlTemplate, devi:
classe per i dati
classe per il ControlTemplate
a questo punto è possibile registrare il controllo in una pagina o user control
e usare il controllo definendo il template
la proprietà va richiamata la keyword Container seguita dal punto e il nome della proprietà.
- creare una classe che rappresenta i dati da passare al template (MessageContainer) che eredita da Control e implementa l'interfaccia INamingContainer
- creare il server control che eredita da WebControl
- in quest'ultimo implementare una proprietà di tipo ITemplate che darà il nome al tag del template (MessageTemplate)
- decorare la proprietà con l'attributo PersistenceMode
- decorare la proprietà con l'attributo TemplateContainer specificando la classe che rappresnta i dati (MessageContainer)
- fare l'override di CreateChildControls, qui creare la classe dati (MessageContainer) e istanziare il template con MessageTemplate.InstantiateIn(message)
- aggiungere il ControlTemplate ( Controls.Add(message) )
C#
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Sgart.Controls
{
C#
public class MessageContainer : Control, INamingContainer
{
public MessageContainer(string userName, string currentTime)
{
this.UserName = userName;
this.CurrentTime = currentTime;
}
public string UserName { get; set; }
public string CurrentTime { get; set; }
}
C#
[ToolboxData("<{0}:SgartTemplateControl runat=server></{0}:SgartTemplateControl>")]
public class SgartTemplateControl : WebControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(MessageContainer))]
public ITemplate MessageTemplate { get; set; }
protected override void CreateChildControls()
{
this.Controls.Clear();
if (MessageTemplate == null)
{
Controls.Add(new LiteralControl("<b>No template defined</b>"));
}
else
{
Panel pnl = new Panel();
Controls.Add(pnl);
MessageContainer message = new MessageContainer(this.Context.User.Identity.Name, DateTime.Now.ToString());
MessageTemplate.InstantiateIn(message);
Controls.Add(message);
}
}
// da usare solo se se non si devono passare dati dall'esterno
// altrimenti richiamare il binding dall'esterno
protected override void OnLoad(EventArgs e)
{
EnsureChildControls();
base.OnLoad(e);
DataBind();
}
}
}
XML
<%@ Register Assembly="SgartTemplateControl" Namespace="Sgart.Controls" TagPrefix="cc1" %>
XML
<cc1:SgartTemplateControl ID="stc1" runat="server">
<MessageTemplate>
Ciao <%# Container.UserName %>
l'ora è: "<%# Container.CurrentTime %>"
</MessageTemplate>
</cc1:SgartTemplateControl>