2009-10-28 6 views
0

Imaginez une page qui utilise des cases à cocher pour garder la trace de listes de diffusion des abonnements sur les animaux:Déterminer quelles cases ne sont pas cochées dans ASP.NET MVC?

cats-list () 
dogs-list (*) 
birds-list () 
horses-list (*) 

J'utilise la méthode d'extension de Html.Checkbox de ASP.NET MVC dans une boucle (non représenté):

<%= Html.Checkbox("subscriptions[" + i +"]", item.subscribed, item.listName) %> 

"i" est la variable d'itération dans la boucle. L'utilisation de cette convention permet à mon action de contrôleur de lier subscriptions[i] à un List<string> qui contient alors une liste de noms de listes de diffusion auxquels s'abonner.

Comment puis-je suivre ce qui n'a pas été vérifié? Par exemple, si un utilisateur décoche "dogs-list" pour se désinscrire de cette liste, comment puis-je le dire? Je ne récupèrerai que "faux" du champ de formulaire caché.

EDIT: La seule solution qui vient à l'esprit est pour l'action du contrôleur de se désabonner de toutes les listes de diffusion, puis de se réabonner aux listes contenues dans le List<string> à partir des cases à cocher. Ce n'est pas idéal cependant.

Répondre

2

Vous avez essentiellement répondu vous-même avec l'édition mais quelque chose d'un peu plus élégant serait mieux. C'est à dire. Ne les supprimez pas tous en premier, il suffit de déterminer quels éléments doivent être ajoutés, lesquels doivent être supprimés et lesquels doivent simplement rester.

E.g. (Code air)

List<string> selectedSubscriptions; //This is passed in from the form using the model binder 
List<string> mailingListsToRemove = GetCurrentMailingLists(); //Looks odd but bear with me 
List<string> mailingListsToAdd = new List<string>(); 

//Loop through all the mailing lists they had selected 
foreach (string selectedMailingList in selectedSubscriptions) 
{ 
    //if the mailing list exists in the list to remove, remove it from that list 
    //because they obviously don't want it removed 
    //Remember that this list also contains their current lists. 
    if (mailingListsToRemove.Contains(selectedMailingList)) 
    { 
     mailingListsToRemove.Remove(selectedMailingList); 
    } 
    else //If it's not in the list to remove then add it 
    { 
     mailingListsToAdd.Add(selectedMailingList); 
    } 
} 

Ainsi, à la fin de cette boucle, vous devez avoir deux listes - un contenant toutes les listes de diffusion que l'utilisateur souhaite retiré et un contenant toutes les nouvelles listes de diffusion qu'ils veulent être abonné. Les listes de diffusion auxquelles ils étaient déjà abonnés et auxquels ils souhaitent toujours s'abonner devraient être laissées seules.

HTHS,
Charles

+0

je n'avais pas pensé approcher comme ça. Très intelligent! Merci. – royco

+0

Juste un autre petit commentaire pour vous remercier à nouveau pour cela. C'est le meilleur extrait de code que j'ai reçu sur StackOverflow. – royco

+0

Aw shucks, tu me fais rougir! Bon d'entendre ça aidé :-) – Charlino

Questions connexes