0

我想生成下面的键入复选框列表

在此处输入图像描述

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

在此处输入图像描述

我有一个服务 (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 类型的新对象 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();
    }

我的模型类为将要创建的每个复选框定义了属性。

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

1 回答 1

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
} 
于 2017-07-17T06:01:26.563 回答