Pergunta

Eu tenho a seguinte situação:

Um usuário irá definir um certo filtro em uma página, e no postback I irá consultar o banco de dados usando esse filtro e retornar um monte de registros correspondentes para o usuário, cada um com uma caixa de seleção ao lado dele, então ele pode escolher se quer agir em cada um desses registros.

No Classic ASP / PHP que pode gerar um monte de controles chamado "chk __ *" e depois em postback passar por todos os $ entradas POST que procuram os prefixados "chk ".

Qual é a melhor maneira de fazer isso em ASP.Net 2.0?

Eu posso fazê-lo facilmente através da implementação de um repetidor com um modelo que contém a caixa de seleção, vincular o repetidor para um conjunto de dados, e em seguida, no segundo Postback, eu apenas fazer:

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

No entanto, este tem o ligeira desvantagem de me dar um Viewstate enorme, o que é muito ruim porque o cliente terá de voltar a fazer upload de todo o estado de visualização para o servidor, e essas pessoas provavelmente irá utilizar meu site através de uma conexão de baixa qualidade.

Quaisquer outras ideias? (Eu também pode criar os controles dinamicamente e iterate através Request.Form como nos velhos tempos, no entanto, eu estava procurando um aspirador

Foi útil?

Solução

Faça-o da mesma forma que fez em ASP clássico. Use em vez de . Você pode acessar os paramaters pós matérias usando Request.Form

Outras dicas

Você olhou para o controle CheckBoxList? Você pode ligá-la para o seu conjunto de dados, fornecer produtos Membro texto e membros de valor, e que também irá permitir que você veja facilmente quais itens são verificados. Há também a possibilidade de adicionar dinamicamente mais itens de caixa de seleção, se necessário.

Eu recomendo a solução ASP clássico, quando confrontado com condições VIEWSTATE absurdas. É triste perder o bom recursos que ele oferece, mas combinando alguns Viewstate habilitado controles (asp: *) com algumas técnicas clássicas (input type = "...") me salvou um muito de dores de cabeça no passado.

Às vezes você apenas quer fazer algo simples, e os simples batidas solução "WYSIWYG" edição forma.

Uma das coisas que eu tenho feito é para registrar o estado de um cheque via AJAX na sessão, em seguida, em Postback (total ou parcial via AJAX), olhar na sessão para os itens para executar a ação selecionada no.

A idéia básica é a de adicionar um manipulador onclick para a caixa de seleção que conhece o id do item associado. No no clique manipulador de comunicar isso para trás ID para o servidor via AJAX e gravá-lo na sessão - você vai precisar para comunicar o status checkbox, bem assim você pode desmarcar itens. Têm a rotina de tratamento para o uso de controle enviar os dados sobre os itens que foram selecionados a partir da sessão.

Desta forma, permite que você manipule dados paginados bem, desde que você pode definir o valor inicial da caixa de seleção da sessão quando o processamento (total ou parcial) uma página com os itens verificados sobre ele.

Pode parecer algo como isto. Assumindo ASP.NET AJAX com PageMethods (e ScriptManager, é claro).

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

Desativar o ViewState. No caso, não pode ser feito tentativa usando Session para armazenar o estado de exibição

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top