将IList绑定到CheckBoxFor将不会返回检查值MVC

时间:2014-06-09 16:52:26

标签: asp.net-mvc checkboxfor

我正在尝试将IList绑定到Html.CheckBoxFor。

当我第一次尝试和调查时,我发现KeyValuePair不会因为它的私有性而完成这项工作,所以我做了一个MyKeyValuePair。所以现在在我的模型中我有:

public GameCreation()
    {
        Orientation = new List<MyKeyValuePair>();
        foreach (var v in Enum.GetNames(typeof(DeveloperPortalMVCApp.Models.Orientation)))
        {
            Orientation.Add(new MyKeyValuePair { Name = v });
        }
    }

    public MyKeyValuePair MyProperty { get; set; }
    public ObservableCollection<MyKeyValuePair> Orientation { get; set; }

我的观点是:

@Html.CheckBoxFor(model => model.MyProperty.Value)
                    @foreach (var f in Model.Orientation)
                    {
                        @Html.CheckBoxFor(model => f.Value)
                    }

问题是IList中的那些MyKeyValuePair不会更新它们的值,但MyProperty会。我错过了什么?

1 个答案:

答案 0 :(得分:1)

使用

@Html.CheckBoxFor(model => model.MyProperty.Value)
@for (var i=0; i < Model.Orientation.Count; i++)
{
    @Html.CheckBoxFor(model => Model.Orientation[i].Value)
}

要特别注意索引器,如果不对复选框编制索引,那么最终会出现一堆带有冲突名称和/或ID的复选框。模型绑定器可能尝试将其绑定为单个项目,而不是列表。

如果你使用上面的代码示例,你会得到类似的东西:

<input type="checkbox" name="Orientation[0].Value" />
<input type="checkbox" name="Orientation[1].Value" />
<input type="checkbox" name="Orientation[2].Value" />

其中,模型绑定器可以解释为列表。 如果你没有在CheckBoxFor中使用索引器,那么你会得到类似的东西:

<input type="checkbox" name="Orientation.Value" />
<input type="checkbox" name="Orientation.Value" />
<input type="checkbox" name="Orientation.Value" />

模型绑定器将无法列出此列表。