C# asp.net mvc中的模型绑定通用列表为空

C# asp.net mvc中的模型绑定通用列表为空,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在index.html中的razor foreach中绑定对象: 查看 @using (Ajax.BeginForm("Save", "Unit", new AjaxOptions { OnSuccess = "onSuccess" })) { <button type="submit" class="btn btn-default" id="saveUnits"><i class="fa fa-save"></i></button>

我正在index.html中的razor foreach中绑定对象:

查看

@using (Ajax.BeginForm("Save", "Unit", new AjaxOptions { OnSuccess = "onSuccess" }))
    {

<button type="submit" class="btn btn-default" id="saveUnits"><i class="fa fa-save"></i></button>


    <table>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>

                    @Html.HiddenFor(modelItem => item.UnitId)
                    <td>
                        @Html.EditorFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.ErrorText)
                    </td>

                </tr>
            }
        </tbody>
    </table>
}
行动

public ActionResult Save(List<Unit> units )
{
    return new EmptyResult();   
}
为什么我的单位实例为空?属性匹配,因此应该绑定它们


我忽略了什么吗?

您需要使用
for
循环,而不是
foreach
循环。另外,最好使您的模型类具有作为集合的属性

您的模型可能类似于:

public class UnitsViewModel
{
    public List<Unit> Units { get; set; }

    public class Unit
    {
        [HiddenInput(DisplayValue = false)]
        public int UnitId { get; set; }

        [DataType(DataType.MultilineText)]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        public string ErrorText { get; set; }
    }
}
公共类单元视图模型
{
公共列表单元{get;set;}
公营课组
{
[HiddenInput(DisplayValue=false)]
public int UnitId{get;set;}
[数据类型(DataType.multilitext)]
公共字符串名称{get;set;}
[数据类型(DataType.multilitext)]
公共字符串ErrorText{get;set;}
}
}
您可以在cshtml中执行以下操作:

@for (int i = 0; i < Model.Count; i++)
{
    <tr>

        @Html.HiddenFor(m => m.Units[i].UnitId)
        <td>
            @Html.EditorFor(m => m.Units[i].Name)
        </td>
        <td>
            @Html.EditorFor(m => m.Units[i].ErrorText)
        </td>

    </tr>
}
@for(int i=0;im.Units[i].UnitId)
@EditorFor(m=>m.Units[i].Name)
@EditorFor(m=>m.Units[i].ErrorText)
}

但是为什么razor scaffold工具使其成为foreach?从modelItem[i]而不是从Model[i]获取当前元素?这没有道理。我得到一个错误,我必须使用列表,因为IEnumerable不知道[]运算符。Razor强迫我使用列表???当我更改为索引顶部站点的列表时,我的所有标题定义都无效:@Html.EditorFor(item=>item.Name)OK这是一个技术限制,它必须是索引的for循环,否则它无法绑定正确的项…有类似的问题foreach是罪魁祸首。可能重复
public class UnitsViewModel
{
    public List<Unit> Units { get; set; }

    public class Unit
    {
        [HiddenInput(DisplayValue = false)]
        public int UnitId { get; set; }

        [DataType(DataType.MultilineText)]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        public string ErrorText { get; set; }
    }
}
@for (int i = 0; i < Model.Count; i++)
{
    <tr>

        @Html.HiddenFor(m => m.Units[i].UnitId)
        <td>
            @Html.EditorFor(m => m.Units[i].Name)
        </td>
        <td>
            @Html.EditorFor(m => m.Units[i].ErrorText)
        </td>

    </tr>
}