Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
Aggiungere un elemento <DeviceSpecific> con un filtro <Choice> impostato su "supportsJavaScript".
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.
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>
Nota: