循环使用Html.CheckBoxFor

时间:2017-07-16 16:58:30

标签: c# asp.net model-view-controller web checkboxfor

我想生成以下类型化复选框列表

enter image description here

当我检查每个复选框(例如levelOne)时,我想看到每个复选框都有一个唯一的ID和名称,如下所示

enter image description here

我有一个服务(ReplayService),它提供了一个对象列表(HierarchyLevels),用于创建Checkbox列表

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

        };
    }

我的控制器类使用层次结构列表列表(由服务创建)来创建IEnumerable类型的新的Object viewModel.HierarchyLevels(在模型中)

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

我的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属性。在下面的代码片段中,我指定了bool属性&#34; levelOne&#34;到所有创建的复选框(因此都具有相同的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 个答案:

答案 0 :(得分: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
}