Supporto desing-time dei controlli ASP.NET

di: Giuseppe Marchi     10 Ottobre 2007

Convertitori di tipo

Questa è veramente una finezza. I convertitori di tipo sono delle particolari classi che supportano la finestra delle Proprietà a fronte di tipi di dati personalizzati. Tale finestra infatti, rappresenta correttamente all'utente finale tutte le proprietà che hanno tipo di dato primitivo (string, int, etc.). Senza un convertitore di tipo infatti, la finestra delle proprietà, a fronte di un tipo custom, si limita semplicemente a stampare la stringa contente il namespace e la classe di tale tipo, eliminando quindi ogni possibile interazione dell'utente sulla proprietà tramite interfaccia grafica.

Per fare un esempio pratico, un enum, che non è un tipo di dato primitivo, ha il suo convertitore (definito dalla classe EnumConverter) per essere rappresentata all'interno della finestra delle proprietà.

Pensando quindi, ad una distribuzione del nostro controllo per un ampio pubblico di sviluppatori, è sempre bene creare un convertitore per ogni tipo di dato personalizzato che abbiamo utilizzato all'interno del nostro controllo.

Veniamo ora al controllo di partenza, il controllo per il rendering di link a finestre pop-up, che come prima implementazione vedeva sue le proprietà PopUpWidth, PopUpHeight e Resizable. Proviamo, a puro titolo d'esempio, a creare un nuovo tipo di dato per rappresentare tutte queste tre informazioni in un'unica proprietà; questo nuovo tipo, sarà rappresentato dalla classe PopUp e definirà una nuova proprietà all'interno del nostro controllo web che sostituirà le tre suddette.

[TypeConverter(typeof(PopUpConverter))]
public class PopUp
{

  private bool resizable;
  private Unit width;
  private Unit height;

  public PopUp()
  {
    resizable = false;
    width = new Unit("700px");
    height = new Unit("500px");
  }

  public PopUp(Unit width, Unit height, bool resizable)
  {
    this.resizable = resizable;
    this.width = width;
    this.height = height;
  }

  [NotifyParentProperty(true)]
  public Unit Height
  {
    get { return height; }
    set { height = value; }
  }

  [NotifyParentProperty(true)]
  public Unit Width
  {
    get { return width; }
    set { width = value; }
  }

  [NotifyParentProperty(true)]
  public bool Resizable
  {
    get { return resizable; }
    set { resizable = value; }
  }
}

[Designer("Peppe.Web.UI.WebControls.Designers.PopUpLinkDesigner")]
public class PopUpLink : WebControl
{
  [Category("Appearance")]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  public PopUp PopUp
  {
    get
    {
      if (popup == null)
      popup = new PopUp();
      return popup;
    }
  }

  // ...
}

Come si vede, la proprietà PopUp è decorata dall'attributo DesignerSerializationVisibility, impostato al valore Content; quell'attributo è utilizzato per specificare in che modalità, tale proprietà deve essere persistita nel codice. Con il valore Content, abbiamo specificato che la proprietà va serializzata completamente all'interno del markup del nostro controllo.

La classe PopUp invece, contiene tutte le proprietà che abbiamo appena descritto, decorate dall'attributo NotifyParentProperty impostato a true. Tale attributo (definito dalla classe NotifyParentPropertyAttribute) indica che la proprietà padre deve essere avvisata ad ogni cambiamento della proprietà figlia. Mente l'attributo di classe TypeConverter indica il convertitore di tipo associato al tipo PopUp.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Amministratore di Reti Windows Server 2008

20 Febbraio 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto