Sviluppo di un controllo basato su modello

ASP.NET fornisce i modelli, una versatile funzionalità che consente di separare i dati dei controlli dalla relativa presentazione. Un controllo basato su modello non fornisce un'interfaccia utente. L'interfaccia utente per il controllo viene fornita dagli sviluppatori di pagine tramite modelli inline, i quali consentono agli sviluppatori di personalizzare l'interfaccia utente per il controllo. Se non si ha familiarità con l'utilizzo dei modelli in ASP.NET, vedere l'esempio riportato nella Guida rapida di ASP.NET —> Web Form ASP.NET —> Accesso ai dati e personalizzazione —> Introduzione ai controlli basati su modello.

Per sviluppare un controllo basato su modello

  1. Implementare System.Web.UI.INamingContainer, un'interfaccia indicatore priva di metodi, mediante la quale viene creata una nuova area di validità della denominazione sotto il controllo in modo da garantire l'univocità degli identificatori dei controlli figlio nella struttura dei nomi.

    public class TemplatedFirstControl : Control,INamingContainer 
    {...}
    
  2. Applicare al controllo l'attributo ParseChildrenAttribute e passare true come argomento. Questa operazione indica al parser di pagine come analizzare i tag delle proprietà del modello quando il controllo viene utilizzato in modo dichiarativo in una pagina ASP.NET. Nel passaggio 3 vengono descritte le modalità per definire una proprietà del modello.

    Nota   Se il controllo deriva da WebControl, non è necessario applicare ParseChildrenAttribute poiché WebControl è già contrassegnato con tale attributo.

    [ ParseChildren(ChildrenAsProperties = true)]
    public class TemplatedFirstControl : Control, INamingContainer {...}
    

    Per ulteriori informazioni sull'attributo ParseChildrenAttribute, vedere Utilizzo di ParseChildrenAttribute.

  3. Definire una o più proprietà di tipo System.Web.UI.ITemplate. ITemplate dispone di un metodo, InstantiateIn, che crea controlli tramite il modello fornito inline nella pagina. Non è necessario implementare il metodo InstantiateIn poiché viene implementato automaticamente dal framework di pagina ASP.NET. Una proprietà ITemplate deve contenere un attributo di metadati di tipo System.Web.UI.TemplateContainerAttribute il quale indica il controllo INamingContainer che conterrà il modello di cui è stata creata un'istanza, come illustrato nel passaggio 4. Nel frammento di codice seguente viene definita una proprietà di modello.

    [TemplateContainer(typeof(FirstTemplateContainer))]                 
     public ITemplate FirstTemplate {...}
    
  4. L'argomento dell'attributo TemplateContainerAttribute è costituito dal tipo di controllo contenitore all'interno del quale si desidera creare l'istanza del modello. Il controllo contenitore è indipendente dal controllo basato su modello che viene creato. Le ragioni per l'utilizzo di un contenitore logico sono legate alla necessità di creare ripetutamente un'istanza, utilizzando dati differenti, di un modello spesso presente in un controllo basato su modello. L'utilizzo di un controllo contenitore diverso dal controllo basato su modello di primo livello consente di disporre di più istanze. Il contenitore logico è l'interfaccia immediata INamingContainer dei controlli figlio all'interno del modello. Per ulteriori informazioni su questa relazione, vedere Sviluppo di un controllo basato su modello con associazione a dati.

    Nota   Poiché sono presenti controlli figlio per i quali è necessario definire nomi univoci all'interno di una pagina, è necessario che il controllo contenitore stesso implementi l'interfaccia INamingContainer.

    public class FirstTemplateContainer : Control, INamingContainer {...}
    
  5. Eseguire l'override del metodo CreateChildControls per creare i controlli figlio nel modello. Per eseguire questa operazione, attenersi alla procedura riportata di seguito.

    1. Creare un'istanza del contenitore di modelli.
    2. Richiamare il metodo InstantiateIn della proprietà di modello e passare il contenitore al metodo come argomento. Il metodo InstantiateIn, dichiarato nell'interfaccia ITemplate, crea un'istanza degli elementi del modello come controlli figlio del contenitore di modelli. Non è necessario implementare il metodo InstantiateIn poiché viene implementato automaticamente dal framework di pagina ASP.NET.
    3. Aggiungere l'istanza del contenitore di modelli all'insieme Controls del controllo basato su modello.

    Nella porzione di codice riportata di seguito viene illustrata un'implementazione del metodo CreateChildControls.

    private Control myTemplateContainer;
    
    protected override void CreateChildControls ()          
    {
       if (FirstTemplate != null)
       {
          myTemplateContainer = new FirstTemplateContainer(this);
             FirstTemplate.InstantiateIn(myTemplateContainer);
          Controls.Add(myTemplateContainer);
        }
        else
        {
            Controls.Add(new LiteralControl(Text + " " + DateTime));
        }
     }
    
    
  6. Eseguire l'override del metodo OnDataBinding ereditato da Control per richiamare il metodo EnsureChildControls. Questa operazione garantisce che la creazione dei controlli figlio nel modello venga eseguita prima che il framework di pagina tenti di valutare qualsiasi espressione di associazione dati all'interno del modello. È necessario inoltre chiamare il metodo OnDataBinding della classe base per assicurare che vengano richiamati i gestori di eventi registrati.

            protected override void OnDataBinding(EventArgs e) {
                EnsureChildControls();
                base.OnDataBinding(e);
            }
    
  7. Ripetere la sequenza all'interno del metodo CreateChildControls illustrata nel passaggio 5 per creare un'istanza di un modello per ciascuna proprietà del modello del controllo.

Per ulteriori esempi di controlli basati su modello, controlli contenitore associati per il modello e pagine che utilizzano i controlli, vedere Esempio di controllo basato su modello.

Vedere anche

Esempio di controllo basato su modello