Asp.net mvc 模型中未返回集合

Asp.net mvc 模型中未返回集合,asp.net-mvc,asp.net-mvc-4,html-helper,Asp.net Mvc,Asp.net Mvc 4,Html Helper,我有一个从视图模型填充的视图,其中一个属性是复杂类型的集合。视图正确呈现,列表被迭代到一个表中,对于每个尚未选择的项,都有一个单选按钮。当我提交表单时,我无法将对象列表返回到模型中,也无法找出我做错了什么。集合中的每个项目都将添加到视图中,如下所示: @for (int i = 0; i < Model.Items.Count; i++ var rowClass = "selectRow"; if (item.IsSelected) { rowCl

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

@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>
}
@for(int i=0;im.Items[i].PropertyOne)
@DisplayFor(m=>m.Items[i].PropertyTwo)
//只有以前未选择的项目才需要单选按钮
@如果(item.IsSelected==false)
{
@Html.RadioButtonOn(m=>m.Items[i].IsSelected,m.Items[i].PropertyOne,新的{id=“IsSelected_”+m.Items[i].PropertyOne})
}
}
我曾尝试使用@Html.HiddenFor(x=>x.PropertyOne),但我无法将所选值的集合绑定回模型。我可以使用隐藏字段返回模型中的所有其他内容,但我不知道如何修复此问题。欢迎提供任何帮助


谢谢

如果您想将收藏正确地发布到模型活页夹,则不能使用
foreach
循环(除非您使用的是
EditorFor
,请参阅注释)。您必须使用一个好的老式
for
循环,并从
IList
派生您的收藏。有关更多信息,请参阅我的问题和答案

此外,对于要发布的集合对象类型的任何属性,都需要确保它在循环中使用

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>
}
…您的循环可能如下所示:

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>
}
…不会发布,但会将其隐藏或在HTML元素中使用

@Html.HiddenFor(m => Model.Items[i].Description)
将正确张贴和绑定


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

我已经看过了,但是当我将foreach更改为for循环时,无法获得提交的视图。请查看我的编辑,并将您的修订代码与原始问题中的
for
循环一起发布为编辑,以便我们可以看到您得到了什么。您好@AJ,您的answer是正确的。有一点是它不必为使用
,你仍然可以使用foreach。看看这个链接:@Lin-谢谢,我不知道
EditorFor
会跨线处理
foreach
。@crunchy-我不相信
DisplayFor
会绑定,除了
for>中缺少的右偏执
loop,你的代码看起来还不错。你摆弄过它来看看发布了什么吗?弄清楚这里发生了什么的最好方法是看看
模型。发布时,电线上有什么项目。你用过摆弄器吗?或FireBug?