ASP.Net MVC 3检索复选框列表值



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

我有一个ViewModel

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的列表。

有人能帮我吗?

谢谢。

我的视图模型中有一个可枚举的

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)

当表单寄回时,模型已正确绑定。

希望这能有所帮助。

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

Phil Haack有一篇关于模型绑定到列表的好文章。我建议你去看看那个。

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新