Domanda

Ho la seguente situazione:

Un utente definirà un certo filtro su una pagina e al postback interrogherò il database usando quel filtro e restituirò all'utente un sacco di record corrispondenti, ognuno con una casella accanto ad esso, in modo che possa scegliere se agire su ciascuno di questi record.

In ASP / PHP classico posso generare molti controlli chiamati " chk __ * " e poi al postback passa attraverso tutte le voci <<> POST che cercano quelle con il prefisso " chk " ;.

Qual è il modo migliore per farlo in ASP.Net 2.0?

Posso farlo facilmente implementando un ripetitore con un modello contenente la casella di controllo, associare il ripetitore a un set di dati e quindi sul secondo postback, faccio semplicemente:

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

    End If
Next

Tuttavia, questo ha il leggero svantaggio di darmi un ENORME Viewstate, il che è davvero un male perché il client dovrà ricaricare l'intero viewstate sul server e queste persone probabilmente useranno il mio sito tramite una connessione scadente.

Altre idee? (Posso anche creare i controlli in modo dinamico ed iterare tramite Request.Form come ai vecchi tempi, tuttavia, stavo cercando un pulitore

È stato utile?

Soluzione

Fallo nello stesso modo in cui l'hai fatto nel classico ASP. Usa & Lt; input type = & Quot; checkbox & Quot; & Gt; invece di < asp: checkbox > ;. Puoi accedere ai parametri di post non elaborati utilizzando Request.Form

Altri suggerimenti

Hai controllato il controllo CheckBoxList? Puoi associarlo al tuo set di dati, fornire elementi di testo e membri di valore e ti permetterà anche di vedere facilmente quali elementi sono stati controllati. C'è anche la possibilità di aggiungere in modo dinamico più elementi della casella di controllo se necessario.

Consiglio la classica soluzione ASP di fronte a condizioni assurde di Viewstate. È triste perdere le belle funzionalità che fornisce, ma combinando alcuni controlli abilitati Viewstate (asp: *) con alcune tecniche classiche (tipo di input = & Quot; ... & Quot; ) mi ha risparmiato un lotto di mal di testa in passato.

A volte vuoi solo fare qualcosa di semplice e la soluzione semplice batte " WYSIWYG " modifica del modulo.

Una delle cose che ho fatto è di registrare lo stato di un controllo tramite AJAX nella sessione, quindi su Postback (completo o parziale tramite AJAX), cercare nella sessione gli elementi su cui eseguire l'azione selezionata.

L'idea di base è aggiungere un gestore onclick alla casella di controllo che conosca l'id dell'elemento associato. Nel gestore al clic, comunica questo ID al server tramite AJAX e registralo nella sessione: dovrai anche comunicare lo stato della casella di controllo in modo da poter deselezionare gli elementi. Chiedi al gestore per il controllo di invio di utilizzare i dati su quali elementi sono stati selezionati dalla sessione.

In questo modo è possibile gestire anche i dati di paging, poiché è possibile impostare il valore iniziale della casella di controllo dalla sessione durante il rendering (completo o parziale) di una pagina con elementi selezionati su di essa.

Potrebbe assomigliare a questo. Supponendo ASP.NET AJAX con PageMethods (e ScriptManager, ovviamente).

<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
         }
     }
}

Disabilita ViewState. Nel caso in cui non sia possibile, provare a utilizzare Session per archiviare la sessione visualizza stato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top