2011-07-21 2 views
4

CheckBoxFor n'est pas délimité lorsqu'une propriété est définie dans un objet imbriqué dans le modèle?CheckboxPour ne pas lier avec des objets imbriqués

Voici un exemple. J'ai un modèle SearchOptions qui contient une propriété List<Star>. Chaque Star a un numéro, un nom et une propriété bool qui devrait être limitée:

public class SearchOptions 
{ 

    public SearchOptions() 
    { 
     // Default values 
     Stars = new List<Star>() 
     { 
      new Star() {Number=1, Name=Resources.Home.Index.Star1, 
       IsSelected=false}, 
      new Star() {Number=2, Name=Resources.Home.Index.Star2, 
       IsSelected=false}, 
      new Star() {Number=3, Name=Resources.Home.Index.Star3, 
       IsSelected=true}, 
      new Star() {Number=4, Name=Resources.Home.Index.Star4, 
       IsSelected=true}, 
      new Star() {Number=5, Name=Resources.Home.Index.Star5, 
       IsSelected=true}, 
     }; 
    } 

    public List<Star> Stars { get; set; } 

} 

À mon avis fortement typé (de SearchOptions) boucle i sur Stars propriété:

@using (Html.BeginForm("Do", "Home")) 
{ 
    <fieldset> 
     <legend>@MVC3TestApplication.Resources.Home.Index.Search</legend> 
     @{ 
      foreach (Star s in Model.Stars) 
      { 
       @Html.CheckBoxFor(m => s.IsSelected) 
       <label>@s.Name</label> 

      }} 
    </fieldset> 
    <input type=submit value="Invia" /> 
} 

La (partie pertinente de) contrôleur est:

public ActionResult SearchOptions() 
    { 
     return View(new SearchOptions()); 
    } 

    [HttpPost] 
    public ActionResult Do(SearchOptions s) 
    { 
     // Do some stuff 
     return View("SearchOptions", s); 
    } 
+0

Votre code a l'air bien - Qu'est-ce qui est réellement faux? Passez-vous dans le modèle via 'View (model)'? – Buildstarted

+0

'Do (SearchOptions s)' montre que 's' a des valeurs anciennes (par défaut), même si je coche/décoche toutes les cases à cocher. Merci de votre aide, – gremo

+0

Ah. Dans ce cas, la raison en est à cause des propriétés imbriquées. La sortie de 'CheckBoxFor()' définit ses valeurs de nom à 's.IsSelected' plutôt que' Model.Star []. IsSelected'. Je vais voir ce que je peux faire ou quelqu'un d'autre va poster la réponse avant moi :) – Buildstarted

Répondre

6

Il est à cause de la façon dont vous accédez aux propriétés dans le CheckBoxFor expression.

@for (int i = 0; i < Model.Stars.Count(); i++) { 
    @Html.CheckBoxFor(m => m.Stars[i].IsSelected) 
    <label>@Model.Stars[i].Name</label> 
} 

Cela devrait fonctionner pour vous.

est ici la sortie des différentes méthodes:

//using the for loop 
<input id="Stars_2__IsSelected" name="Stars[2].IsSelected" type="checkbox" value="true" /> 

//using the foreach 
<input checked="checked" id="s_IsSelected" name="s.IsSelected" type="checkbox" value="true" /> 

Vous remarquerez que le foreach pour ne contient pas le nom propre pour qu'il corresponde au moment de faire la liaison modèle.

+0

Works. Mais il y a un problème étrange: après que les étiquettes POST obtiennent une valeur vide. Je viens d'utiliser '

+0

La raison en est que les helpers 'Html' utilisent les valeurs de poste des éléments de la liste. Comme les valeurs post sont null pour la propriété Name, elles seront vides lorsqu'elles seront réutilisées (puisqu'elles remplaceront les valeurs par défaut). Je ne suis pas sûr de ce que vous pouvez faire d'autre que de repeupler les noms et les numéros avant la sortie. – Buildstarted

+0

Est-ce que 'Bind (Exclude =" Name ")' fais le tour? – gremo

Questions connexes