【问题标题】:Looping with a Html.CheckBoxFor使用 Html.CheckBoxFor 循环
【发布时间】:2017-07-16 16:58:29
【问题描述】:

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

当我检查每个复选框(例如 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 属性。在下面的代码 sn-p 中,我将布尔属性“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>
}

【问题讨论】:

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


    【解决方案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
    } 
    

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多