Controles SelectionList e postbacks
Seleção de itens em um SelectionList controles ASP.NET para dispositivo móvel não gera uma resposta do servidor. O formulário no qual o SelectionList controle aparece deve ser postada de volta ao servidor. Isso geralmente é feito com um Command controle. Quando o Command controle envia o formulário para o servidor, o SelectionList controlar gera um SelectedIndexChanged evento. Seu aplicativo pode fornecer um método para tratar este evento.
Outra maneira de responder a uma seleção é adicionar suporte para dispositivos que podem lidar com o cliente JavaScript (por exemplo, navegadores HTML).Para esses dispositivos, use o seguinte procedimento:
Adicionar um <devicespecific> elemento com um <choice> filtro definido para "supportsJavaScript".
Criar um modelo de conteúdo dentro de opção que contém o ASP.NET DropDownList controle. Esse é o controle de servidor do ASP.NET de non–mobile.
Set the DropDownList control's AutoPostBackproperty to true.
Você deve criar um <devicespecific> filtro com um modelo de conteúdo para todos os dispositivos que não oferecem suporte a JavaScript e que usam o SelectionList controle.
O exemplo de código a seguir demonstra essa técnica:
<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>
Este exemplo requer as seguintes configurações no arquivo Web.config:
<configuration>
<system.web>
<deviceFilters>
<filter name="supportsJavaScript"
compare="javascript"
argument="true"/>
</deviceFilters>
</system.web>
</configuration>
Tratamento de solicitação variações quando postagem entre páginas
SelectionList controles podem exigir manipulação adicional no caso especial de uma POST entre páginas. Por exemplo, considere duas páginas, fonte.aspx e destino.aspx, onde fonte.aspx contém um SelectionList controle e postagens destino.aspx.
O exemplo a seguir mostra a marcação da página fonte.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>
O exemplo a seguir mostra a marcação e código para a página destino.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>
Suponha que o usuário navega até fonte.aspx, seleciona o primeiro e o terceiro itens na caixa de listagem e clica no botão de comando, que faz com que a página ser postada para destino.aspx.O texto exibido para Label1 Em destino.aspx varia de acordo com a linguagem de marcação e dispositivo. Essas diferenças são devido à diferenças nas implementações do navegador e especificações de HTML e WML.Você poderá ver os seguintes resultados:
Destino |
Resultado |
Descrição |
---|---|---|
Navegador HTML |
"1, 3" |
Delimitados por vírgulas e espaços com nenhum delimitador final. |
Dispositivo WML 1 |
"1;3" |
Delimitados por ponto-e-vírgula com nenhum delimitador final. |
Dispositivo WML 2 |
"1;3;" |
Delimitados por ponto-e-vírgula com um delimitador final. |
Para mais com com facilidade use o valor do Request["MultiSelectList1"] pré-variável na página de destino, você pode processar sistema autônomo dados postados em lista de seleção, conforme mostrado no exemplo a seguir. Isso padroniza as diversas possibilidades para concordar com o formato usado pelo navegador HTML.
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(";", ", ");
}
Observação: |
---|
Essa manipulação especial é necessário no caso comum de postagem de volta para a mesma página que contém o Controle SelectionList |
Alguns dispositivos cHTML requerem nomes exclusivos para cada caixa de seleção.Nesse caso, o nome gerado para a caixa de seleção é do formulário identificador * número de item para cada caixa de seleção.Você pode usar código semelhante ao exemplo a seguir ao codificar cenários entre páginas.No exemplo, MyPage1.aspx contém o seguinte formulário da Web móvel e um SelectionList controle.
<mobile:form runat=server action=MyPage2.aspx>
<mobile:selectionList id="mySList ...>
...
</mobile:form>
MyPage2.aspx tem o código a seguir:
<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>