2011-07-21 4 views
4

モデルにネストされたオブジェクトにプロパティが定義されている場合、CheckBoxForは限定されません。CheckboxForネストされたオブジェクトとバインドしない

ここは例です。 List<Star>プロパティを含むSearchOptionsモデルがあります。

@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" /> 
} 

(関連部分:Stars性質上(SearchOptionsの)私の強く型付けされたビューで

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

} 

iループ:各Starは番号、名前と区切られるべきbool性質を持っていますof)のコントローラは:

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

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

コードが正常に表示されます - 実際何が間違っていますか?あなたは 'View(model)'を通してモデルを渡していますか? – Buildstarted

+0

'Do(SearchOptions s)'は、すべてのチェックボックスをオンまたはオフにしても 's'に古い(デフォルト)値があることを示します。助けてくれてありがとう、 – gremo

+0

ああ。その場合、理由はネストされたプロパティのためです。 'CheckBoxFor()'の出力は 'Model.Star []。IsSelected'ではなく' s.IsSelected'に名前の値を設定します。私は私が何をすることができるか、誰かが私の前に答えを投稿します参照してください:) – Buildstarted

答えて

6

のプロパティにアクセスしているからです式。

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

これはうまくいくはずです。

//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" /> 

あなたはそれが結合モデルをやったときに一致させるためのforeachのために適切な名前が含まれていないことがわかります:

は、ここで、異なる方法からの出力です。

+0

作品。しかし、奇妙な問題があります:POSTラベルの後に空の値を取得します。 Model.Stars [i] .Nameをいくつかの入力フィールドに束縛することなく '

+0

理由は、 'Html'ヘルパーがリスト項目のポスト値を使うからです。ポスト値は 'Name'プロパティの' null'なので、再利用すると空になります(デフォルト値をオーバーライドするため)。出力前に名前と数字を再入力する以外に何ができるのか分かりません。 – Buildstarted

+0

'Bind(Exclude =" Name ")'はトリックを行うことができますか? – gremo

関連する問題