Proprietà di default per il designer con custom control di ASP.NET

di Andrea Moro, in ASP.NET 2.0, Custom Control, UserScript,

In passato mi sono trovato di fronte alla necessità di dover creare un Web Control per ASP.NET al fine di incapsulare una porzione di codice che avrei sicuramente potuto condividere tra più progetti.
Una cosa di cui ho avuto bisogno era un vero Default Value, cosa che sulle prime si potrebbe pensare immediata. In effetti la soluzione lo è, ma lo si appura solo dopo aver confrontato diverse soluzioni e testato diverso codice che non è quello solitamente proposto.

Per riassumere, quello che volevo ottenere è la seguente situazione:
- al trascinamento del controllo nella pagina volevo che automaticamente nel markup code venissero scritte quelle che io ritenevo le mie proprietà di default con un valore x;
- utilizzando l'attributo DefaultValue, volevo che in caso di match tra valore attributo e valore proprietà, il markup code rimanesse invariato;

A prima vista la classe Designer potrebbe fare al caso nostro, ma non funziona come dovrebbe e lo scopo è perfettamente raggiungibile tramite l'attributo ToolBoxData.
Con questo attributo il designer interpreta - ogni qual volta un controllo viene trascinato sul designer del form - il valore contenuto al suo interno e lo usa per comporre il markup code da inserire nella pagina.
Dentro a questo attributo semplicemente si scrivono le proprietà che si vuole facciano parte del markup code, quindi quel valore di default visibile che stavo cercando.

Sembrerebbe tutto risolto, ma non è così. Questo giochino infatti funziona bene solamente se decoriamo le nostre proprietà con un ulteriore altro attributo: il DesignerSerializationVisibility, che una volta impostato con l'enum su DesignerSerializationVisibility.Visible, indica al designer di persistere il valore della proprietà sempre e comunque, anche quando il valore di default dell'attributo corrisponde a quello della proprietà.

Questo risolve un secondo problema, quello dell'attributo DefaultValue che cancella il markupcode in caso di corrispondenza tra valore attributo e valore proprietà.

[ToolboxData("<{0}:MioWebControl runat=server PropA=1></{0}:MioWebControl>")]
public class MioWebControl : WebControl
{
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public string MyProperty { get; set; }
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi