Quelle est la meilleure façon d’envoyer un grand nombre de cases à cocher au client dans ASP.Net ?

StackOverflow https://stackoverflow.com/questions/235608

Question

J'ai la situation suivante :

Un utilisateur définira un certain filtre sur une page, et lors de la publication, j'interrogerai la base de données en utilisant ce filtre et renverrai un ensemble d'enregistrements correspondants à l'utilisateur, chacun avec une case à cocher à côté, afin qu'il puisse choisir d'agir sur chacun. de ces enregistrements.

Dans Classic ASP / PHP, je peux générer de nombreux contrôles nommés "chk__*", puis lors de la publication, parcourir tous les $Entrées POST recherchant celles avec le préfixe "chk"".

Quelle est la meilleure façon de procéder dans ASP.Net 2.0 ?

Je peux le faire facilement en implémentant un répéteur avec un modèle contenant la case à cocher, en liant le répéteur à un ensemble de données, puis lors de la deuxième publication, je fais simplement :

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

    End If
Next

Cependant, cela a le léger inconvénient de me donner un ÉNORME Viewstate, ce qui est vraiment mauvais car le client devra télécharger à nouveau l'intégralité de l'état de vue sur le serveur, et ces personnes utiliseront probablement mon site avec une connexion de mauvaise qualité.

D'autres idées ?(Je peux également créer les contrôles de manière dynamique et parcourir Request.Form comme autrefois, cependant, je cherchais un outil plus propre.

Était-ce utile?

La solution

Faites-le de la même manière que dans ASP classique.Utilisez <input type="checkbox"> au lieu de <asp:checkbox>.Vous pouvez accéder aux paramètres bruts de la publication en utilisant Request.Form

Autres conseils

Avez-vous regardé le contrôle CheckBoxList ?Vous pouvez le lier à votre ensemble de données, fournir des éléments de membre de texte et de valeur, et il vous permettra également de voir facilement quels éléments sont vérifiés.Il est également possible d'ajouter dynamiquement d'autres éléments de case à cocher si nécessaire.

Je recommande la solution ASP classique face à des conditions Viewstate absurdes.Il est triste de perdre les fonctionnalités intéressantes qu'il offre, mais en combinant quelques Les contrôles activés par Viewstate (asp:*) avec certaines techniques classiques (input type="...") m'ont épargné un parcelle de maux de tête dans le passé.

Parfois, vous voulez juste faire quelque chose de simple, et la solution simple surpasse l'édition de formulaire "WYSIWYG".

L'une des choses que j'ai faites est d'enregistrer l'état d'une vérification via AJAX dans la session, puis lors de la publication (complète ou partielle via AJAX), de rechercher dans la session les éléments sur lesquels effectuer l'action sélectionnée.

L'idée de base est d'ajouter un gestionnaire onclick à la case à cocher qui connaît l'identifiant de l'élément associé.Dans le gestionnaire au clic, communiquez cet identifiant au serveur via AJAX et enregistrez-le dans la session. Vous devrez également communiquer l'état de la case à cocher afin de pouvoir décocher les éléments.Demandez au gestionnaire du contrôle de soumission d'utiliser les données sur les éléments sélectionnés dans la session.

Cette méthode vous permet également de gérer les données paginées, puisque vous pouvez définir la valeur initiale de la case à cocher à partir de la session lors du rendu (complet ou partiel) d'une page contenant des éléments cochés.

Cela pourrait ressembler à ceci.En supposant ASP.NET AJAX avec PageMethods (et ScriptManager, bien sûr).

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

Désactivez le ViewState.Si cela ne peut pas être fait, essayez d'utiliser Session pour stocker l'état d'affichage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top