Condividi tramite


Insiemi di modelli e controlli basati su modelli

Aggiornamento: novembre 2007

In ASP.NET sono disponibili controlli basati su modelli che espongono numerose proprietà di modelli per la definizione del contenuto e del layout del controllo. I modelli vengono inseriti nelle posizioni appropriate durante l'esecuzione del rendering del controllo. Esistono ad esempio modelli per il controllo List, quali modelli di intestazione e piè di pagina. Questa funzionalità consente di personalizzare in modo significativo l'aspetto dei controlli in fase di esecuzione in base al dispositivo.

Nei controlli mobili ASP.NET questa funzionalità viene estesa e viene introdotta la nozione di insiemi di modelli. Un insieme di modelli è una raccolta di modelli. Tuttavia un singolo controllo basato su modelli potrebbe fare riferimento a più insiemi di modelli, ciascuno con differenti criteri specifici per dispositivo.

Rendering di criteri per insiemi di modelli

Ogni insieme di modelli di un controllo basato su modelli è contenuto in un elemento <Choice> all'interno di un elemento <DeviceSpecific> condiviso. In fase di esecuzione le opzioni presenti nell'elemento <DeviceSpecific> vengono valutate per ordine. Il primo elemento <Choice> corrispondente viene utilizzato per il contenuto specifico per il dispositivo. Se tale scelta include modelli, il controllo li utilizza. Se non vengono individuati modelli o se nessuna delle scelte specificate è opportuna, il controllo esegue il rendering dei tag predefiniti.

Modelli indipendenti dal dispositivo

I controlli basati su modelli possono disporre di un modello indipendente dal dispositivo. Per specificare modelli indipendenti dal dispositivo, utilizzare un elemento <Choice> senza un attributo Filter esplicito. La scelta indipendente dal dispositivo, se specificata, deve essere sempre l'ultima scelta dichiarata, in modo che venga scelta nel caso in cui nessun'altra si applichi al dispositivo di destinazione.

Rendering specifico di controllo

Il comportamento del rendering dei controlli nella modalità basata su modelli è specifico del controllo. Alcuni controlli, ad esempio List e ObjectList, possono eseguire il rendering di tutto il contenuto a partire dai modelli forniti. Altri controlli possono aggiungere il contenuto di modelli specifici al proprio contenuto predefinito. Se ad esempio viene selezionato un modello di intestazione o piè di pagina per il controllo Form, i tag contenuti nel modello vengono aggiunti al contenuto del form rispettivamente come intestazione o piè di pagina.

Impostazione delle proprietà per un controllo basato su modelli

Per impostare a livello di codice le proprietà di un controllo in un modello, è necessario ottenere un riferimento al contenitore di denominazione e utilizzare il metodo FindControl per trovare il controllo. Quindi è possibile impostare le proprietà. Questa tecnica è illustrata nell'esempio riportato di seguito.

Nota:

Poiché le informazioni del foglio di stile vengono caricate prima che sia possibile modificare la proprietà StyleReference a livello di codice, la modifica della proprietà nel codice non produce alcun effetto.

void Page_Load(Object sender, EventArgs e)
{
    // Iterate through the controls in the form.
    foreach(Control c in Form1.Controls)
    {
        if(c.GetType()) == typeof(TemplateContainer)
        {
            // Get the link control.
            Link ctrl = (Link)c.FindControl("myLink");
            if (ctrl != null)
            {
                // Set the text and url properties.
                ctrl.Text = "Home Page";
                ctrl.NavigateURL = "https://www.microsoft.com";
            }
        }
    }
}

Insiemi di modelli e stili

Negli stili di un controllo StyleSheet possono essere contenuti anche insiemi di modelli. In questo modo è possibile disporre di controlli basati su più modelli che fanno riferimento allo stesso stile, utilizzare gli stessi insiemi di modelli e ottenere gli stessi vantaggi dell''incapsulamento reso disponibile da uno stile. Per un esempio relativo agli insiemi di modelli, vedere Guida rapida sui controlli mobili ASP.NET.

Modelli di stile e proprietà di stile

È possibile ereditare uno stile da un oggetto padre, impostare in modo esplicito la proprietà StyleReference o ereditare lo stile tramite aggregazione. Con i modelli, tuttavia, non si ha un effetto a cascata. Non è possibile recuperare un modello da un modello di stile padre se all'interno di un foglio di stile non viene utilizzato un modello. Per ulteriori informazioni, vedere Stili.

Modelli aggiunti in modo dinamico

In alcuni scenari avanzati è utile creare istanze in modo dinamico e aggiungere modelli. L'esempio di codice che segue consente di aggiungere modelli in un gestore eventi Init.

<%@ Page Language="C#" 
    Inherits="System.Web.UI.MobileControls.MobilePage" %>
<script >
    private void Form_Init(object sender, System.EventArgs e)
    {
        DeviceSpecific devSpecific = new DeviceSpecific();

        // Create the choice tag.
        DeviceSpecificChoice devChoice = 
            new DeviceSpecificChoice();
        devChoice.Filter = "isHTML32";

        // Create the template.
        ITemplate myTemplate = 
            new CustomTemplate("HeaderTemplate");

        // Create the templateContainer.
        TemplateContainer container = new TemplateContainer();
        myTemplate.InstantiateIn(container);

        // Create the tree.
        devChoice.Templates.Add("HeaderTemplate", myTemplate);
        ((IParserAccessor)devSpecific).AddParsedSubObject(devChoice);
        ((IParserAccessor)form1).AddParsedSubObject(devSpecific);
    }
    public class CustomTemplate : ITemplate
    {
        String strWhichTemplate;

        public CustomTemplate(String strTemplate)
        {
            strWhichTemplate = strTemplate;
        }

        public void InstantiateIn(Control container)
        {
            if (strWhichTemplate == "HeaderTemplate")
            {
                System.Web.UI.MobileControls.Label lb =
                    new System.Web.UI.MobileControls.Label();
                lb.Text = "Header Template";

                System.Web.UI.MobileControls.Command cmd = 
                    new System.Web.UI.MobileControls.Command();
                cmd.Text = "heLLo";

                container.Controls.Add(lb);
                container.Controls.Add(cmd);
            }
            else if (strWhichTemplate == "FooterTemplate")
            {
                System.Web.UI.MobileControls.Label lb = 
                    new System.Web.UI.MobileControls.Label();
                lb.Text = "FooterTemplate";
                container.Controls.Add(lb);
            }
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
  <mobile:form id="form1"  OnInit="Form_Init">
  </mobile:form>
</body>
</html>

Considerazioni specifiche per l'utilizzo di modelli specifici di dispositivo

Quando si uniscono linguaggi markup specifici di dispositivo ai controlli mobili, è necessario assicurare la congruenza in base agli elementi di cui i controlli mobili eseguono il rendering. Il rilevamento e l'adattamento intelligente per codici misti specifici di dispositivo e indipendenti dal dispositivo non è supportato.

Si considerino ad esempio l'impostazione alignment nel primo controllo Panel e nel controllo Label nell'esempio di codice riportato di seguito.

<mobile:Panel runat=server alignment="right">
<DeviceSpecific>
  <Choice Filter="isWML11">
    <ContentTemplate>
      <table columns="2" align="LR">
        <tr><td>
    </ContentTemplate>
  </Choice></Devicespecific>
</mobile:panel>

<Mobile:Label id="label1" runat=server Text="HELLO, HOW ARE YOU?" 
    alignment="left">
</Mobile:Label>
<mobile:Panel runat=server>
<DeviceSpecific>
  <Choice Filter="isWML11">
    <ContentTemplate></td><td>
    </ContentTemplate>
  </Choice>
</DeviceSpecific> 
</mobile:panel>

Gli elementi <p> WML vengono utilizzati per eseguire il rendering dell'allineamento non predefinito. Nell'esempio precedente il secondo controllo Label è contenuto in un elemento <td> WML e il browser esegue un rendering errato dell'elemento <p> generato per il secondo controllo Label perché contenuto nel tag <td>.

In questo caso, non ereditando l'allineamento dal primo controllo Panel, il controllo Label genera un tag <p> per l'allineamento. Non è tuttavia possibile aggiungere un tag <p> in questa situazione. Non si tratta di una situazione usuale, ma è possibile eludere il problema contrassegnando il controllo Label come visibile se il dispositivo di destinazione non è basato su WML e specificando il testo del controllo Label all'interno del modello.

Codice arbitrario specifico di dispositivo

In alcuni casi è opportuno inserire un codice arbitrario per un dispositivo o un tipo di dispositivo specifici. A tale scopo, nelle pagine Web ASP.NET per dispositivi mobili è disponibile un modello di contenuto per il controllo Panel. Se nell'opzione selezionata è incluso un modello di contenuto, il controllo esegue il rendering utilizzando il modello anziché il contenuto.

Vedere anche

Concetti

Stili

Supporto del modello di dispositivo

Altre risorse

Guida per gli sviluppatori di applicazioni

Sviluppo di pagine Web ASP.NET per dispositivi mobili

Progettazione e rendering dei contenuti per i controlli mobili ASP.NET