Maintenir l'état d'une liste dynamique de cases à cocher dans ASP.NET MVC
J'ai une classe appelée "PropertyFeature" qui contient tout simplement PropertyFeatureID et la Description. C'est un bon modèle créé par LINQ to SQL mappé à une base de données SQL Server le tableau. Un exemple d'instance/ligne serait:
PropertyFeatureID: 2
Description: "Swimming Pool"
Le nombre de lignes (PropertyFeatures) peut bien sûr grandir et rétrécir, et j'ai donc de vouloir rendre une liste de cases à cocher, de sorte que l'utilisateur peut sélectionner l'un d'eux.
J'dynamique peut rendre les Cases assez facilement, avec quelque chose comme:
<%foreach (var Feature in (ViewData["Features"] as IEnumerable<MySolution.Models.PropertyFeature>)) { %>
<%=Html.CheckBox("Features", new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%><label for="Feature<%=Feature.PropertyFeatureID%>"><%=Feature.Description%></label>
<%}%>
Je spécifiez l'ID pour chaque case, et de rendre l'étiquette correspondante, de sorte que l'utilisateur peut intuitivement cliquez sur l'étiquette et activer /désactiver la case à cocher - qui fonctionne très bien.
J'ai défini la Case "nom" de "Caractéristiques" de sorte que toutes les cases de rendu avec le même nom, et le Modèle MVC Liant les empile dans une collection unique appelé "Caractéristiques" lorsque le formulaire est affiché. Cela fonctionne très bien.
Une fois le formulaire envoyé, j'utilise les valeurs contrôlées et de les stocker, donc j'ai besoin de réelles valeurs entières donc je sais qui PropertyFeature est sélectionné, pas juste un tas de Booléens et les noms de champ. Donc, idéalement, je le veux comme un tableau ou une collection qui est facile à travailler avec.
Je suis en mesure de récupérer les valeurs sélectionnées à partir de l'intérieur de ma méthode de Contrôleur lorsque le bouton est cliqué parce que j'ai spécifié le paramètre de type int[] Caractéristiques.
Mais le problème est qu'il ne maintient pas l'état. C'est, lorsque je clique sur le bouton submit et le rechargement de la page (avec le formulaire de nouveau affiché) je souhaite à tous de la dynamique des cases à cocher pour conserver leur statut vérifié (ou pas). Tous les autres champs que j'ai créé avec Html.DropDownList
et Html.TextBox
toutes les maintenir leurs etats avec succès pas de problèmes à tous sur la même page dans la même forme.
J'ai passé des heures à lire tous les autres threads et des articles sur des sujets similaires et il y a beaucoup de parler en utilisant ICollection
et IDictionary
de regrouper les choses et de comprendre une valeur Booléenne pour chaque élément de sorte qu'il peut maintenir la case à cocher état. Mais je ne suis pas 100% saisir comment les utiliser que dans le cadre de mon propre exemple. Je tiens à garder la solution vraiment simple et ne pas avoir à coder des pages de nouvelles classes pour maintenir ma case à cocher état.
Quelle est la plus propre et la bonne façon de le faire?
Ouais corriger. En fait, je pense qu'il ne fonctionne pas du tout, même pas pour la première case. J'ai joué un peu plus avec la Liste contraignante et il semble beaucoup plus prometteuse. Mais toujours un peu compliqué et je n'ai pas été en mesure de verrouiller la meilleure solution pour le moment.
OriginalL'auteur Aaron | 2010-07-20
Vous devez vous connecter pour publier un commentaire.
Je l'ai eu à travailler après beaucoup de jouer avec les différentes approches.
Dans la vue:
Dans la réception de la méthode de contrôleur:
Cette méthode a un certain nombre d'avantages:
Je recommande cette approche pour tous ceux qui veulent le plus propre /ballonnement-gratuit solution pour une dynamique de la liste de case à cocher lorsque vous avez besoin de l'Id et vous voulez juste pour se mettre au travail!
OriginalL'auteur Aaron
Le problème est que lorsque vous êtes rendu de votre liste de cases à cocher, vous n'êtes pas le réglage de l'un d'eux. Vous aurez besoin de mettre votre
int[] Features
dans ViewData, et ensuite dans ta boucle foreach, vérifier pour voir si l'ID de cette Fonction est dans le tableau dans ViewData.quelque chose comme:
bien que je n'ai pas le tester, il pourrait ne pas être de 100%.
la droite. la première fois que le chargement de la page, votre SelectedFeatures tableau sera vide, donc pas de cases à cocher est cochée. ensuite, sur votre publication, vous aurez pop la SelectedFeatures tableau dans ViewData, et elle peut être utilisée lors de l'Affichage des charges.
Ouais exactement. Bravo pour votre aide Dave.
OriginalL'auteur dave thieben