Controlli SelectionList e postback

Aggiornamento: novembre 2007

Se si selezionano elementi in un controllo mobile ASP.NET SelectionList, non viene generata una risposta dal server. È pertanto necessario eseguire il postback al server del form su cui viene visualizzato il controllo SelectionList. A tale scopo si utilizza in genere un controllo Command. Quando il controllo Command esegue il postback del form al server, il controllo SelectionList genera un evento SelectedIndexChanged. L'applicazione può garantire un metodo per la gestione di questo evento.

Un altro modo di rispondere a una selezione consiste nell'aggiungere il supporto per i dispositivi in grado di gestire JavaScript sul lato client, ad esempio i browser HTML. Per tali dispositivi utilizzare la seguente procedura:

  1. Aggiungere un controllo Panel al controllo Form.

  2. Aggiungere un elemento <DeviceSpecific> con un filtro <Choice> impostato su "supportsJavaScript".

  3. Creare un modello di contenuto all'interno dell'opzione in cui è presente il controllo DropDownList ASP.NET. Si tratta del controllo server ASP.NET non mobile.

  4. Impostare la proprietà AutoPostBackdel controllo DropDownList su true.

È necessario creare un filtro <DeviceSpecific> con un modello di contenuto per tutti gli altri dispositivi che non supportano JavaScript e in cui viene utilizzato il controllo SelectionList.

Questa tecnica viene descritta nell'esempio di codice riportato di seguito:

<mobile:Panel id="Panel1" >
  <mobile:DeviceSpecific id="DeviceSpecific1" >
    <Choice Filter="supportsJavaScript">
      <ContentTemplate>
        <asp:DropDownList id="DropDownList1" 
            OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" 
          AutoPostBack="True">
          <asp:ListItem Value="a">1</asp:ListItem>
          <asp:ListItem Value="b">2</asp:ListItem>
          <asp:ListItem Value="c">3</asp:ListItem>
        </asp:DropDownList>
      </ContentTemplate>
    </Choice>
    <Choice>
      <ContentTemplate>
        <mobile:SelectionList id="SelectionList1" 
           OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
           <Item Value="a" Text="1"/>
           <Item Value="a" Text="2"/>
           <Item Value="a" Text="3"/>
        </mobile:SelectionList>
        <mobile:Command  text="Submit"/>
      </ContentTemplate>
    </Choice>
  </mobile:DeviceSpecific>
</mobile:Panel>

In questo esempio si presuppone che nel file Web.config siano contenute le seguenti impostazioni:

<configuration>
  <system.web>
    <deviceFilters>
      <filter name="supportsJavaScript"
              compare="javascript"
              argument="true"/>
    </deviceFilters>
  </system.web>
</configuration>

Gestione delle variazioni di richieste nel caso di invio tra più pagine

I controlli SelectionList potrebbero rendere necessarie ulteriori operazioni di gestione nel caso particolare di un cross-page posting. Si considerino ad esempio due pagine, Source.aspx e Destination.aspx, dove Source.aspx contiene un controllo SelectionList ed esegue l'invio a Destination.aspx.

Nell'esempio riportato di seguito vengono illustrati i tag della pagina Source.aspx:

<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage"
    Language="C#" %>
<mobile:Form  method="post" action="destination.aspx">
  <mobile:SelectionList  
      selectType="MultiSelectListBox" id="MultiSelectList1">
    <item text="I" value="1" />
    <item text="ii" value="2" />
    <item text="iii" value="3" />
  </mobile:SelectionList>
  <mobile:command runat=server text="Post" />
</mobile:Form>

Nell'esempio riportato di seguito vengono illustrati i tag e il codice della pagina Destination.aspx:

<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage" 
    Language="C#" %>
<%@ Register TagPrefix="Mobile"
    Namespace="System.Web.UI.MobileControls"
    Assembly="System.Web.Mobile" %>
<script runat=server language=cs>
    public void Page_Load()
    {
       Label1.Text = Request["MultiSelectList1"];
    }
</script>

<mobile:form runat=server>
  <mobile:label id="Label1"  />
</mobile:form>

Si supponga che l'utente passi alla pagina Source.aspx, selezioni il primo e il terzo elemento nella casella di riepilogo e faccia clic sul pulsante di comando inviando così la pagina a Destination.aspx. Il testo visualizzato per Label1 in Destination.aspx varia a seconda del linguaggio di markup e del dispositivo. Tali differenze sono dovute alle specifiche HTML e WML e alle differenze nelle implementazioni del browser. È possibile che si ottengano i risultati seguenti:

Destinazione

Risultato

Descrizione

Browser HTML

"1, 3"

Delimitato da virgole e spazi, senza delimitatore finale.

Dispositivo WML 1

"1;3"

Delimitato da punti e virgole, senza delimitatore finale.

Dispositivo WML 2

"1;3;"

Delimitato da punti e virgole con delimitatore finale.

Per utilizzare più facilmente il valore della variabile Request["MultiSelectList1"] nella pagina di destinazione, è possibile pre-elaborare i dati inviati dall'elenco di selezione come illustrato nell'esempio riportato di seguito. Così facendo le diverse possibilità di compatibilità con il formato utilizzato dal browser HTML vengono standardizzate.

public void Page_Load() 
{
    String selections = Request["MultiSelectList1"];
    if (selections.Length > 0 && 
        selections [selections.Length - 1] == ';')
    {
        selections = selections.Substring(0, selections.Length - 1);
    }
    Label1.Text = selections.Replace(";", ", ");
} 
Nota:

Queste particolari operazioni di gestione non sono necessarie nel caso comune di postback alla stessa pagina in cui è contenuto il controllo SelectionList.

Alcuni dispositivi cHTML rendono necessario l'utilizzo di nomi univoci per ciascuna casella di controllo. In questo caso, il nome generato dalla casella di controllo si presenta nella forma identificatore*numero di elemento per ogni casella di controllo. Quando si scrive codice per situazioni in cui viene eseguito il cross-page posting, è possibile avvalersi dell'esempio riportato di seguito. Nell'esempio in MyPage1.aspx sono contenuti il Web Form mobile seguente e un controllo SelectionList.

<mobile:form runat=server action=MyPage2.aspx>
  <mobile:selectionList  id="mySList ...>
    ...
</mobile:form>

Viene riportato di seguito il codice di MyPage2.aspx:

<script >
    // Create a Form just for the list selections
    System.Collections.Specialized.NameValueCollection  _myForm = 
        new NameValueCollection();
    public void Page_Init()
    {
        // Process the Form
        foreach(String key in Request.Form.Keys)
        {
            // Look for an asterisk in the key
            int pos = key.LastIndexOf('*');
            if (pos > -1)
            {
                // Add the modified key to the Form
                _myForm.Add(key.Substring(0, pos), Request.Form[key])
            }
            Else
            {
                // Or add the unmodified key to the Form
                _myForm.Add(key, Request.Form[key]);
            }
        }
    }

    // Use _myForm in place of Request.Form
    public void Page_Load()
    {
        // Get the processed list of selected items
        String selectedValues = _myForm["mySList"];
        // etc.
    }
</script>

Vedere anche

Concetti

Accesso ai dati mediante i controlli elenco