SelectionList e postback

Se si selezionano elementi in un controllo mobile ASP.NET SelectionList non viene generata alcuna risposta dal lato server dell'applicazione. È necessario eseguire il postback al server del form in cui viene visualizzato il controllo SelectionList. A questo 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 eseguire l'operazione 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 controllo <deviceSpecific> con un filtro <Choice> equivalente a supportsJavaScript.
  3. Creare un modello di contenuto all'interno dell'opzione in cui è presente il controllo ASP.NET DropDownList. Si tratta del controllo server ASP.NET non mobile.
  4. Per il controllo DropDownList, impostare la proprietà AutoPostBack associata su true.

Sarà necessario creare un filtro <deviceSpecific> con un modello di contenuto per tutti gli altri dispositivi non JavaScript in cui viene utilizzato il controllo SelectionList.

Nell'esempio di codice riportato di seguito viene illustrato questo processo.

  <mobile:Panel id="Panel1" runat="server">
        <mobile:DeviceSpecific id="DeviceSpecific1" runat="server">
              <Choice Filter="supportsJavaScript">
                  <ContentTemplate>
                      <asp:DropDownList id="DropDownList1" runat="server" 
                           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" 
                              runat="server"
                              OnSelectedIndexChanged=
                              "DropDownList1_SelectedIndexChanged">
                          <Item Value="a" Text="1"/>
                          <Item Value="a" Text="2"/>
                          <Item Value="a" Text="3"/>
                      </mobile:SelectionList>
                      <mobile:Command runat="server" text="Submit"/>
                  </ContentTemplate>
              </Choice>
        </mobile:DeviceSpecific>
    </mobile:Panel>

Web.config

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

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

Gli elenchi di selezione potrebbero rendere necessarie ulteriori operazioni di gestione nel caso particolare di un invio tra più pagine. Un esempio potrebbe essere rappresentato da due pagine, source.aspx e dest.aspx. Nella prima, source.aspx, è presente un controllo SelectionList e viene eseguita un'operazione di invio a dest.aspx.

Codice di source.aspx:

<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage" Language="C#" %>
<mobile:Form runat=server method=post action=dest.aspx>
   <mobile:SelectionList runat=server 
           selectType=MultiSelectListBox id=slst>
      <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>

Codice di dest.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["slst"];
}
</script>

<mobile:form runat=server>
   <mobile:label id=label1 runat=server/>
</mobile:form>

Se l'utente passa alla pagina source.aspx, seleziona il primo e il terzo elemento della casella di riepilogo a selezione multipla e fa clic sul pulsante command, provocando un postback alla pagina dest.aspx, il testo visualizzato per label1 in dest.aspx varia in base al linguaggio con tag e al dispositivo. Tali differenze sono dovute alle specifiche HTML e WML e alle differenze nelle implementazioni del browser.

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 con maggiore semplicità il valore di Request["slst"] nella pagina di destinazione, può essere utile pre-elaborare i dati inviati dall'elenco di selezione nel modo riportato di seguito. Così facendo le diverse possibilità di compatibilità con il formato utilizzato dal browser HTML vengono standardizzate.

public void Page_Load() 
{
    String req = Request["slst"];
    if (req.Length > 0 && req[req.Length - 1] == ';')
    {
        req = req.Substring(0, req.Length - 1);
    }
    lbl1.Text = req.Replace(";",", ");
} 

Nota   Queste speciali operazioni di gestione sono inutili nel caso comune di postback alla 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 l'invio tra più pagine, è possibile avvalersi dell'esempio riportato di seguito.

// Form 1.
<mobile:form runat=server action=page2.aspx>
<mobile:selectionList runat=server id=mySlst ...>
...
</mobile:form>

// Form 2.
<script runat=server>
System.Collections.Specialized.NameValueCollection  _myForm = new NameValueCollection();
public void Page_Init()
{
   // Process Form.
   foreach(String key in Request.Form.Keys)
   {
      int pos;
      if ((pos = key.LastIndexOf('*')) > -1)
      {
         _myForm.Add(key.Substring(0, pos), Request.Form[key])
      }
      else
      {
         _myForm.Add(key, Request.Form[key]);
      }
   }
}

// Use _myForm in place of Request.Form.
public void Page_Load()
{
   String selectedValues = _myForm["mySlst"];
   //
}

Vedere anche

Accesso ai dati mediante i controlli elenco