Insiemi di modelli e controlli basati su modelli

In ASP.NET sono disponibili controlli basati su modelli, ossia controlli che espongono numerose proprietà di modelli che lo sviluppatore può applicare per contrassegnare con tag gli elementi di destinazione. 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 notevolmente l'aspetto dei controlli in fase di esecuzione in base al dispositivo.

I controlli mobili ASP.NET estendono questo modello e introducono la nozione di insieme 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> situato all'interno di un elemento <DeviceSpecific> condiviso.

In fase di esecuzione le scelte 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 predefinito.

Durante la progettazione non è possibile modificare a livello di codice la proprietà StyleReference nel form corrente e passare immediatamente a un altro form e aspettarsi che i controlli eseguano il rendering con la nuova impostazione di stile. I modelli di stile vengono caricati prima di fare riferimento alla proprietà StyleReference; la modifica a livello di codice viene eseguita dopo.

Rendering specifico di controllo

Il comportamento del rendering dei controlli nella modalità basata su modelli è specifico del controllo. Alcuni controlli, quali 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, un modello di intestazione o piè di pagina viene specificato e scelto per il controllo Form, il tag contenuto nel modello viene aggiunto al contenuto del form rispettivamente come intestazione o piè di pagina.

Impostazione delle proprietà per un controllo basato su modelli

L'impostazione delle proprietà in un controllo contenuto in un modello è leggermente più complessa rispetto al caso in cui il controllo non si trovi in un modello. È necessario ottenere un riferimento al contenitore di denominazione e utilizzare il metodo FindControl per individuare il controllo di collegamento. Quindi è possibile impostare le proprietà. Nell'esempio che segue vengono illustrati brevemente questi concetti.

void Page_Load(Object sender, EventArgs e) {

  // Iterate through the controls in the form.
  foreach(Control c in Form1.Controls)   {

      if(c.GetType().ToString() ==
      "System.Web.UI.MobileControls.TemplateContainer")     {
      // Get the link control.
      Control ctrl = c.FindControl("myLink");

      if (ctrl != null)       {
        // Set the text and url properties.
        ((System.Web.UI.MobileControls.Link)ctrl).Text = "Home Page";
        ((System.Web.UI.MobileControls.Link)ctrl).NavigateURL = 
          "http://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 in cui vengono illustrati gli insiemi di modelli, vedere la Guida rapida sui controlli mobili ASP.NET.

Modelli di stile e proprietà di stile

Come descritto nella documentazione relativa agli stili, è possibile ereditare uno stile da un elemento padre, impostare in modo esplicito la proprietà StyleReference o ereditare lo stile tramite l'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.

Modelli indipendenti dal dispositivo

I controlli basati su modelli possono disporre di un modello indipendente dal dispositivo. Per specificare i 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.

Interfaccia utente basata sui modelli nei controlli di form

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" Debug="true"%>
<script runat="server">
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;
   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>
<body>
   <mobile:Form id="Form1" runat="server" OnInit="Form_Init">
   </mobile:Form>
</body>

Considerazioni specifiche per l'utilizzo di modelli specifici di dispositivo

Quando si uniscono linguaggi con tag 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 tag misti specifici di dispositivo e indipendenti dal dispositivo non è supportato.

Osservare ad esempio l'impostazione alignment nel primo controllo Panel e il controllo Label nel codice di esempio parziale 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 WML <p> vengono utilizzati per eseguire il rendering dell'allineamento non predefinito. Nell'esempio precedente, il secondo controllo Label si trova all'interno di un tag WML <td>, mentre del tag <p> generato per il secondo controllo Label non viene eseguito correttamente il rendering dal browser in quanto situato all'interno del tag <td>.

In questo caso il controllo Label non eredita l'allineamento dal primo controllo Panel, per cui genera un tag <p> per l'allineamento. Tuttavia non è 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.

Tag arbitrario specifico di dispositivo

In alcuni casi è opportuno inserire un tag arbitrario per un dispositivo o un tipo di dispositivo specifici. Per eseguire questa operazione, i Web Forms mobili di ASP.NET rendono disponibili un modello ContentTemplate per il controllo Panel. Se in una scelta selezionata è contenuto un modello ContentTemplate, il controllo esegue il rendering utilizzando il modello invece del contenuto usuale.

Vedere anche

Stili | Supporto del modello di dispositivo | Guida per gli sviluppatori di applicazioni | Sviluppo di applicazioni Web mobili ASP.NET | Progettazione e rendering dei contenuti per i controlli mobili