2009-08-08 3 views
1

Je suis aux prises avec Html.Checkbox dans ASP.NET MVC. Imaginez un employé avec un groupe répétitif des enfants:Comment puis-je utiliser Html.Checkbox pour supprimer des groupes répétitifs dans ASP.NET MVC?

alt text http://img220.imageshack.us/img220/7208/deletechildrensnapshotk.png

Le « Ajouter un enfant » bouton fonctionne très bien, mais je ne peux pas utiliser de manière fiable « Supprimer les enfants sélectionnés ». Je rends les cases à cocher avec ceci:

<% int i = 0; %> 
<% foreach (var item in Model.Children) { %> 
    <tr> 
     <td> 
     <%=Html.CheckBox("childrenToDelete[" + i + "]", false, new {value = item.Name})> 
     </td> 
    </tr> 
<% i++; %> 
<% } %> 

Voilà comment mon action de contrôleur obtient la liste des enfants à supprimer d'un FormCollection:

var childrenToDelete = new List<string>(); 
UpdateModel(childrenToDelete, "childrenToDelete"); 

je puis créer un objet en utilisant le modèle ViewModel qui contient l'employé et une liste d'enfants. Je n'arrive pas à comprendre pourquoi 85% du temps, je lance une exception dans la ligne View sur la ligne Html.Checkbox. Environ 15% du temps, ça fonctionne bien. L'exception est "La conversion du paramètre de type 'System.String' en type 'System.Boolean' a échoué." IE affiche alors:

  • FormatException: La chaîne n'a pas été reconnue comme une valeur booléenne valide. FormatException: Bobby n'est pas une valeur valide pour Boolean.

Bien sûr, "Bobby" n'est pas un booléen, donc il échoue. Toute idée sur la raison pour laquelle Html.Checkbox essaie d'utiliser "Bobby" comme un booléen? Le même ViewModel fonctionne très bien pour ajouter des enfants, donc je ne pense pas avoir une erreur là-bas.

+0

Publiez tout le code de votre action POST, s'il vous plaît –

+0

@ eu-ge-ne: Le voici: http://pastebin.ca/1522362 – royco

+0

Mise à jour: Il semble que je peux toujours supprimer le dernier enfant de la liste.L'objet newChildren que je passe à ViewModel a toujours la liste d'enfants correcte et mise à jour. Je pense que j'ai la bonne stratégie ici, mais je dois juste avoir un bug quelque part. – royco

Répondre

0

A enfin, je pense que je l'ai compris. Je ne savais pas que Html Helpers obtiennent leurs valeurs à partir des emplacements suivants (cités de "Pro Framework ASP.NET MVC" par Steven Sanderson):.

  1. ViewData.ModelState [ "controlName"] Value.RawValue
  2. paramètre « valeur » est passé à la méthode d'aide HTML, ou si vous avez appelé une surcharge qui ne comprend pas un paramètre « valeur », puis ViewData.Eval (« controlName »)

Depuis ma forme est un post-retour, mes assistants Html ont essayé d'obtenir leurs valeurs de ModelState. Un exemple de résultat est "Bobby, false" lorsque vous essayez de supprimer Bobby. Cela perturbe probablement Html.CheckBox d'une certaine façon, je ne vais pas prendre le temps d'enquêter en ce moment. Comme le souligne @darin, une solution de contournement sans Html Helpers fonctionne très bien.

Je ne pouvais pas comprendre cela depuis le plus longtemps depuis que mon modèle était correct. Je n'ai même pas pensé à regarder ModelState. Cela n'a probablement pas aidé que je n'avais pas encore lu la section sur la validation dans le livre de Sanderson.

4

L'assistant Html.CheckBox ajoute un champ masqué au formulaire. Je vous suggère de vous attribuer un identifiant unique à chaque élément de la collection Les enfants et ensuite dans votre forme au lieu d'utiliser l'assistant:

<% foreach (var child in Model.Children) { %> 
    <input type="checkbox" name="childrenToDelete" value="<%=child.Id%>" /> 
<%}%> 

Et puis dans votre action de contrôleur:

public ActionResult DeleteChildren(string[] childrenToDelete) 
{ 
    // childrenToDelete array will contain selected ids of children to delete 
    return View(); 
} 
+0

C'est une stratégie que j'ai utilisée dans le passé. Il est dommage que quelques-uns des assistants de MVC semblent rendre les choses plus compliquées. –

+0

@darin: C'est ce que j'ai essayé de faire au début, mais j'ai d'autres données postées depuis le formulaire et même si j'ai dû utiliser UpdateModel(). Je ne vois pas comment je peux utiliser un tableau comme paramètre de méthode d'action si j'ai plus de données, peut-être dans un formulaire de collection. Des idées? – royco

Questions connexes