Per creare un server control C# che supporta i template o ControlTemplate, devi:
  • 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
{
classe per i dati

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; }
  }
classe per il ControlTemplate

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();
    }
  }
}
a questo punto è possibile registrare il controllo in una pagina o user control

XML

<%@ Register Assembly="SgartTemplateControl" Namespace="Sgart.Controls" TagPrefix="cc1" %>
e usare il controllo definendo il template

XML

<cc1:SgartTemplateControl ID="stc1" runat="server">
  <MessageTemplate>
       Ciao <%# Container.UserName %>
       l'ora è: "<%# Container.CurrentTime %>"
  </MessageTemplate>
</cc1:SgartTemplateControl>
la proprietà va richiamata la keyword Container seguita dal punto e il nome della proprietà.
Tags:
ASP.NET54 C#236 Esempi225
Potrebbe interessarti anche: