【问题标题】:ASP.Net MVC 3 Retrieve Checkbox List ValuesASP.Net MVC 3 检索复选框列表值
【发布时间】:2012-04-15 23:14:51
【问题描述】:

我正在开发一个 ASP.Net MVC 3 Web 应用程序,但在从复选框列表中获取值时遇到了一些困难。我已经阅读了 Stackoverflow 上有关该领域的大部分问题,但是我仍然遇到一些问题。

我有一个视图模型

public class ViewModelCheckBox
{
    public string Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}

另一个使用上述视图模型的视图模型

public class ViewModelAssignSubSpeciality
{
    public ListItem Item { get; set; }
    public IList<ViewModelCheckBox> SpecialityList { get; set; }
}

然后在我的控制器中

public ActionResult AssignSubSpeciality(int id)
{
        //Get a list of all sub-specialities
        var SpecialityList = _listService.GetListItemsByID(3).ToList();

        //Get a list of sub-specialities for the the passed in id, this is either the id of a speciality or grade
        IList<RelationshipSpecialitySub> assignedSpecialities = _listService.GetAssignedSubSpecialities(id).ToList();

        var checkBoxList = new List<ViewModelCheckBox>();

        foreach (ListItem item in SpecialityList)
        {
            ViewModelCheckBox chkBox = new ViewModelCheckBox { Id = item.listItemID.ToString(), Name = item.description };

            //If sub-speciality exists in assignedSpecialities list, then make checkbox checked
            foreach (var specilaity in assignedSpecialities)
            {
                if (specilaity.subID == item.listItemID)
                {
                    chkBox.Checked = true;
                }
                else
                {
                    chkBox.Checked = false;
                }
            }

            checkBoxList.Add(chkBox);
        }

        ViewModelAssignSubSpeciality viewModel = new ViewModelAssignSubSpeciality();
        viewModel.ListItem = _listService.GetListItemByID(id);
        viewModel.SpecialityList = checkBoxList;

        return View(viewModel);
    }

上面控制器中的代码获取所有可能的复选框列表项的列表,然后获取所有先前选中的复选框列表项的列表,并将选中的选项设置为 true。

然后我的视图看起来像这样,遍历 SpecialityList 并为每个项目创建一个复选框,如果需要,还将其选定值设置为 true。

<fieldset>
<legend>Specialities</legend>

@foreach (var item in Model.SpecialityList)
{
<input type="checkbox" id="@item.Id" name="@item.Name" value="@item.Id" @(item.Checked ? "checked" : "") />
<label for="@item.Id">@item.Name</label><br />
}

<input type="submit" value="Save Changes" class="sepH_b" />                                         

我的控制器中的 HttpPost 方法如下所示

    public ActionResult AssignSubSpeciality(ViewModelAssignSubSpeciality model)
    {
        //delete all sub-specialities in tbl relationshipSpecialitySub for List
        foreach (ViewModelCheckBox item in model.SpecialityList)
        {
                //_listService.DeleteSubSpecialityFromSpeciality(item.Id);
        }

        return RedirectToAction("ListItems", new { id = model.ListItem.listID });
    }

但是,当我尝试在

中获取选中的复选框时
model.SpecialityList

我们总是为空。我不确定为什么它不包含 ViewModelCheckBox 列表。

谁能帮我解决这个问题?

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 checkbox viewmodel checkboxlist


    【解决方案1】:

    我的视图模型中有一个 Enumerable

    public class CheckBoxItem
    {
       public string Code { get; set; }
       public bool IsChecked { get; set; }
       public string Label {get;set;}
    }
    

    然后我使用编辑器模板将它们显示在页面上。

    <p class="checkbox" style="display:inline">
    <span style="margin-left:5px;">
        @Html.HiddenFor(x => x.Code)           
        @Html.CheckBoxFor(x => x.IsChecked)
    </span>
    @Html.LabelFor(x => x.IsChecked, Model.Label)
    </p>
    

    在视图中,我使用以下内容在页面上显示它们。

    @Html.EditorFor(m => m.MyEnumerableOfCheckBoxItem)
    

    当表单被回发时,模型被正确绑定。

    希望这会有所帮助。

    【讨论】:

    • 有趣,我一直在寻找类似的东西。谢谢。
    • @DarinDimitrov 嗨,知道为什么@Html.EditorFor(m => m.XXXX) 会在 UI 上给出一个数字,以及 EditorFor 如何知道如何渲染模型。提前致谢。
    • 你的模型应该是 List 吗?然后在你的编辑器模板中循环?你有例子吗?
    【解决方案2】:

    这是因为您将复选框命名为 @item.Name。模型绑定器将检查它是否可以将其映射到模型中的特定属性,但它找不到它,因为它正在寻找 @item.Name 的值而不是 SpecialtyList 属性。

    Phil Haack 有一篇关于模型绑定到列表的好文章。我建议你检查一下。

    另外,我认为您不能将模型绑定到自定义对象,因为传入的复选框的值只是字符串。您应该在模型上创建另一个类型为 IEnumerable 的属性,复选框的值与模型绑定。它看起来像这样:

    public IList<ViewModelCheckBox> SpecialityList { get; set; }
    public IEnumerable<string> SpecialityListValues { get; set; }
    

    这样,您可以使用SpecialityList 填充视图中的值,并使用SpecialityListValues 检索值。请注意,复选框的名称必须与SpecialityListValues相对应。

    【讨论】:

      【解决方案3】:

      @RubbleFord 提供了一个很好的答案。但是,如果您在同一页面上创建了多个列表,它可能会下降,因为标签 For 属性将引用页面更上方的标签。

      为了解决这个问题,我将编辑器模板更改为:

      <p class="checkbox" style="display:inline">
          <label>
              @Html.HiddenFor(x => x.Code)
              @Html.CheckBoxFor(x => x.IsChecked)
              @Model.Label
          </label>
      </p>
      

      其他一切都一样,但是这用标签包裹了复选框,因此可以删除 For。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 2013-08-05
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 2015-11-29
        • 1970-01-01
        • 2011-09-07
        相关资源
        最近更新 更多