收集不在模型中返回

时间:2014-02-13 19:06:29

标签: asp.net-mvc asp.net-mvc-4 html-helper

我有一个从视图模型填充的视图,其中一个属性是复杂类型的集合。视图正确呈现,列表被迭代到一个表中,每个项目的单选按钮都没有被选中。当我提交表单时,我无法将对象列表返回到模型中,我无法弄清楚我做错了什么。集合中的每个项目都将添加到视图中,如下所示:

@for (int i = 0; i < Model.Items.Count; i++
    var rowClass = "selectRow";

    if (item.IsSelected)
    {
        rowClass = "success";
    }


    <tr class="@rowClass">
        @Html.HiddenFor(m => m.Items[i].PropertyOne)
        <td>
            @Html.DisplayFor(m =>  m.Items[i].PropertyTwo)
        </td>
        <td class="actions">
            // only those items not previously selected need a radio button
            @if (item.IsSelected == false)
            {
                @Html.RadioButtonFor(m =>  m.Items[i].IsSelected,  m.Items[i].PropertyOne, new { id = "IsSelected_" +  m.Items[i].PropertyOne })
            }
        </td>
    </tr>
}

我尝试过使用@ Html.HiddenFor(x =&gt; x.PropertyOne),但我无法将所选值的集合绑定回模型。我可以使用隐藏字段返回模型中的其他所有内容,但我不知道如何解决这个问题。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:2)

如果您希望集合正确发布到模型绑定器,则不能使用foreach循环(除非您使用EditorFor,请参阅注释)。您必须使用旧的for循环,并使您的集合派生自IList。有关详细信息,请参阅我的问题和答案here

此外,您希望发布的集合对象类型的任何属性,您需要确保它在循环中使用。所以,假设您的Item课程如下:

public class Item
{
    public int ItemId { get; set; }
    public string ItemDescription { get; set; }
    public bool IsSelected { get; set; }
}

...你的循环可能如下所示:

@for(var i = 0;i < Model.Items.Count; i++)
{
    <tr>
        @Html.HiddenFor(m => Model.Items[i].ItemId)
        <td>
             @Html.TextBoxFor(m => Model.Items[i].Description)
        </td>
        <td>
             @Html.CheckBoxFor(m => Model.Items[i].IsSelected)
        </td>
    </tr>
}

同样重要的是要注意,仅显示模型属性将不会发布它。意思是......

@Model.Items[i].Description

...不会发布,但会将其隐藏或在HTML元素中使用...

@Html.HiddenFor(m => Model.Items[i].Description)

将正确发布和绑定。

可以找到Phil Haack关于此主题的权威文章之一here