Compartilhar via


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:

  1. Adicionar um Panel o controle para o Form controle.

  2. Adicionar um <devicespecific> elemento com um <choice> filtro definido para "supportsJavaScript".

  3. 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.

  4. 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>

Consulte também

Conceitos

Acessar dados usando controles de lista