SelectionList-Steuerelemente und Postbacks
Aktualisiert: November 2007
Die Auswahl von Elementen in einem SelectionList-ASP.NET Mobile-Steuerelement generiert keine Antwort vom Server. Das Formular, auf dem das SelectionList-Steuerelement angezeigt wird, muss in einem Postback an den Server gesendet werden. Dies geschieht üblicherweise mit einem Command-Steuerelement. Wenn das Command-Steuerelement das Formular in einem Postback zurück an den Server sendet, löst das SelectionList-Steuerelement ein SelectedIndexChanged-Ereignis aus. Die Anwendung kann eine Methode zum Behandeln dieses Ereignisses bereitstellen.
Eine andere Möglichkeit, auf eine Auswahl zu reagieren, besteht darin, Unterstützung für Geräte hinzuzufügen, die clientseitiges JavaScript verarbeiten können (z. B. HTML-Browser). Verwenden Sie für diese Geräte folgendes Verfahren:
Fügen Sie dem Form-Steuerelement ein Panel-Steuerelement hinzu.
Fügen Sie ein <DeviceSpecific>-Element mit einem <Choice>-Filter hinzu, der "supportsJavaScript" entspricht.
Erstellen Sie eine Inhaltsvorlage in der Auswahl, die das ASP.NET DropDownList-Steuerelement enthält. Dies ist das nicht ASP.NET Mobile-Serversteuerelement.
Legen Sie die AutoPostBack-Eigenschaft des DropDownList-Steuerelements auf true fest.
Sie müssen einen <DeviceSpecific>-Filter mit einer Inhaltsvorlage für alle anderen Geräte erstellen, die kein JavaScript unterstützen und das SelectionList-Steuerelement verwenden.
Diese Vorgehensweise wird anhand des folgenden Codebeispiels erläutert:
<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>
Dieses Beispiel erfordert die folgenden Einstellungen in der Datei Web.config:
<configuration>
<system.web>
<deviceFilters>
<filter name="supportsJavaScript"
compare="javascript"
argument="true"/>
</deviceFilters>
</system.web>
</configuration>
Behandeln von Anforderungsabweichungen beim Senden zwischen Seiten
SelectionList-Steuerelemente können im Sonderfall des Sendens zwischen verschiedenen Seiten eine zusätzliche Behandlung erfordern. Nehmen Sie zum Beispiel die zwei Seiten Source.aspx und Destination.aspx, wobei Source.aspx ein SelectionList-Steuerelement enthält und etwas an Destination.aspx sendet.
Das folgende Beispiel zeigt das Markup für die Seite Source.aspx:
<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage"
Language="C#" %>
<mobile:Form runat="server" method="post" action="destination.aspx">
<mobile:SelectionList runat="server"
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>
Das folgende Beispiel zeigt Markup und Code für die Seite 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" runat="server" />
</mobile:form>
Angenommen, der Benutzer ruft Source.aspx auf, wählt das erste und dritte Element im Listenfeld aus und klickt auf die Befehlsschaltfläche, sodass die Seite an Destination.aspx gesendet wird. Der für Label1 in Destination.aspx angezeigte Text variiert je nach Markupsprache und Gerät. Diese Unterschiede sind durch die HTML- und WML-Spezifikationen sowie durch unterschiedliche Browser-Implementierungen bedingt. Folgende Ergebnisse sind möglich:
Zielgerät |
Ergebnis |
Beschreibung |
---|---|---|
HTML-Browser |
"1, 3" |
Abtrennung erfolgt durch Kommas und Leerzeichen ohne nachfolgendes Trennzeichen. |
WML-Gerät 1 |
"1;3" |
Abtrennung erfolgt durch Semikolons ohne nachfolgendes Trennzeichen. |
WML-Gerät 2 |
"1;3;" |
Abtrennung erfolgt durch Semikolons mit nachfolgendem Trennzeichen. |
Um den Wert der Request["MultiSelectList1"]-Variable in der Zielseite einfacher zu verwenden, können Sie die gesendeten Daten aus der Auswahlliste vorher aufbereiten, wie im folgenden Beispiel zu sehen ist. Dadurch werden die verschiedenen Möglichkeiten so standardisiert, dass sie mit dem vom HTML-Browser verwendeten Format übereinstimmen.
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(";", ", ");
}
Hinweis: |
---|
Diese besondere Behandlung ist nicht erforderlich, wenn ein Postback an dieselbe Seite mit dem SelectionList-Steuerelement erfolgt (dies ist der Regelfall). |
Einige cHTML-Geräte erfordern für jedes Kontrollkästchen eindeutige Namen. In diesem Fall hat der für das jeweilige Kontrollkästchen generierte Name die Form Bezeichner*Elementnummer. Sie können Szenarien für das Senden zwischen Seiten ähnlich wie im folgenden Beispiel codieren. Im Beispiel enthält MyPage1.aspx das folgende mobile Web Form und ein SelectionList-Steuerelement.
<mobile:form runat=server action=MyPage2.aspx>
<mobile:selectionList runat="server" id="mySList ...>
...
</mobile:form>
MyPage2.aspx besitzt den folgenden Code:
<script runat="server">
// 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>