2017-07-16 81 views
0

我想生產類型的複選框有Html.CheckBoxFor循環

enter image description here

的文章當我檢查每一個複選框(如LEVELONE)我希望看到每一個都具有唯一的ID和名稱,如下面

enter image description here

我有一個服務,其將被用來創建複選框

列表(ReplayService),其提供的對象(HierarchyLevels)的列表
 public IEnumerable<HierarchyLevels> GetHierarchyLevels() 
    { 
     return new List<HierarchyLevels>() 
     { 
      new HierarchyLevels{Name="LevelOne",ShortName="L1", IsSelected = false}, 
      new HierarchyLevels{Name="LevelTwo",ShortName="L2", IsSelected = false}, 
      new HierarchyLevels{Name="TLevelThree",ShortName="L3", IsSelected = false}, 
      new HierarchyLevels{Name="LevelFour",ShortName="L4", IsSelected = false}, 

     }; 
    } 

我的控制器類使用HierarchyLevels的類型的IEnumerable的

 public ActionResult Index() 
    { 
     var vm = new MyViewModel(); 
     PopulateViewModel(vm.viewModel); 
     return View(viewModel); 
    } 

    private void PopulateViewModel(ContentReplayViewModelBase viewModel) 
    { 
     var hierarchyLevels = replayService.GetHierarchyLevels(); 
     viewModel.HierarchyLevels = hierarchyLevels.Select(h => new SelectListItem {Text = h.Name, Selected = h.IsSelected}).ToArray(); 
    } 

我的模型類已定義的屬性的列表(由服務創建的),以創建新的對象viewModel.HierarchyLevels(在Model)每個複選框將被創建。

public abstract class ReplayViewModelBase 
{ 
    public IEnumerable<SelectListItem> HierarchyLevels { get; set; } 
    .... 
    .... 
} 

public class ReplayByHierarchyLevels : ReplayViewModelBase 
{ 
    public bool levelOne { get; set; } 
    public bool leveltwo { get; set; } 
    public bool levelThree { get; set; } 
    public bool levelFour { get; set; } 
    ..... 
    ..... 
} 

在我查看我循環瀏覽HierarchyLevels列表併產生一個複選框列表。我遇到的問題是我不確定如何遍歷對象列表並在模型中分配唯一的bool屬性。在下面的代碼片段我指定布爾屬性「LEVELONE」到所有創建的複選框(結果都具有相同的ID和姓名)

@foreach (var level in Model.ReplayByHierarchyLevels.HierarchyLevels) 
{ 
    <tr> 
     <td>@level.Text</td> 
     <td>@Html.CheckBox(level.Text, level.Selected)</td> 
     <td>** @Html.CheckBoxFor(x => x.ReplayByHierarchyLevels.levelOne, Model.ReplayByHierarchyLevels.levelOne = level.Selected)</td> 
    </tr> 
} 

回答

1

個人而言,我只想綁定到HierarchyLevels,所以複選框觀點是:

@for(int i =0; i < Model.ReplayByHierarchyLevels.HierarchyLevels.Count; i++) 
{ 
    <tr> 
     <td>@Model.ReplayByHierarchyLevels.HierarchyLevels[i].Text</td> 
     <td> 
      @Html.CheckBoxFor(m => m.ReplayByHierarchyLevels.HierarchyLevels[i].Selected) 
      @Html.HiddenFor(m => m.ReplayByHierarchyLevels.HierarchyLevels[i].Text) 
      @Html.HiddenFor(m => m.ReplayByHierarchyLevels.HierarchyLevels[i].Value) 
     </td> 
    </tr> 
} 

然後如果你想強類型的訪問,你可以改變視圖模型ReplayByHierarchyLevels做:

public class ReplayByHierarchyLevels : ReplayViewModelBase 
{ 
    // be aware may be null 
    public bool levelOne { get{return HierarchyLevels.FirstOrDefault(x => x.Text == "levelOne").Selected;} } 

    // rest the same 
}