C# ASP.Net MVC索引输入未绑定到POST上的模型

C# ASP.Net MVC索引输入未绑定到POST上的模型,c#,asp.net,razor,asp.net-mvc-5.1,C#,Asp.net,Razor,Asp.net Mvc 5.1,我正试图使用以下命令将数据发回控制器,但模型列表始终以空值发回 我已经检查了呈现的html,它对我来说似乎是有效的,但也许我遗漏了什么。以前从未这样做过,我认为如果输入与模型匹配,那么它会自动绑定 剃须刀视图 @for (int i = 0; i < Model.Addons.Count; i++) { if (Model.Addons[i].AddonType == AddonType.Bacon) { <div>

我正试图使用以下命令将数据发回控制器,但模型列表始终以空值发回

我已经检查了呈现的html,它对我来说似乎是有效的,但也许我遗漏了什么。以前从未这样做过,我认为如果输入与模型匹配,那么它会自动绑定

剃须刀视图

    @for (int i = 0; i < Model.Addons.Count; i++)
{
    if (Model.Addons[i].AddonType == AddonType.Bacon)
    {
        <div>
            @Html.HiddenFor(x => Model.Addons[i].Id)
            @Html.TextBoxFor(x => Model.Addons[i].Quantity, new { @style = "width: 40px", @class = "form-control calculated", data_price = Model.Addons[i].Price })
            @Model.Addons[i].Name
            @(" ($")@Model.Addons[i].Price@(")")
        </div><br />
    }
}
控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(BaconOrderModel model)
{
    var baconOrder = new BaconOrder();
    foreach (var addon in model.Addons)
    {
        if (addon.IsSelected)
        {
            baconOrder.Addons.Add(new Addon
            {
                AddonId = addon.Id,
                Quantity = addon.Quantity
            });
        }
    }

    _baconOrderService.Add(baconOrder);
    return RedirectToAction("Index");
}

我认为问题在于索引需要从0开始按顺序进行。因为您正在计算i并过滤,所以第一个项目的索引是32


索引器需要从0开始并按顺序排列。

作为您最后一条评论的答案:

我认为默认绑定模型就是这样工作的。有关模型绑定的介绍,请参见

您可以使用此语法包含/排除属性,这也有助于降低恶意攻击的风险

public ActionResult Edit([Bind(Include = "Name")]Student student)
{
    ...
}

不过,大多数时候,我使用的是简单的视图模型,它只携带他们需要的数据。

经过几次尝试和下面的建议,我意识到这里的根本问题是索引。挑战在于我的列表是按一种类型(枚举)分组的,并且我是按这种枚举类型呈现表单的每个部分。由于我在主列表中获取值的位置,索引不符合顺序。目前我已经修复了如下问题

在视图顶部

@{ var index = 0; } 
每个部分(添加类型)

@for(int i=0;i
{index++;}
}
}

我想知道这是不是最好的方法?我试图在我的模型中创建另一个要绑定的空列表,但它似乎抛出了一个“超出范围”的异常。我想知道是否有更好的方法?

模型和Razor代码不匹配,例如quantity属性在哪里?我假设这是发回控制器的。控制器接受什么对象类型?可能还提供控制器代码?发布的控制器代码还修复了模型缺少数量属性。它在代码中,我一定没有粘贴它。将最后两个也放在隐藏字段中,否则它们将被发布为Null。只是为了让我理解,我需要将所有属性作为输入,以便它发回?有什么原因(我有点好奇:)我认为这是我的问题,但我不知道如何更正索引,索引号是我需要显示的。将其设置为0或1会给出错误的结果。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(BaconOrderModel model)
{
    var baconOrder = new BaconOrder();
    foreach (var addon in model.Addons)
    {
        if (addon.IsSelected)
        {
            baconOrder.Addons.Add(new Addon
            {
                AddonId = addon.Id,
                Quantity = addon.Quantity
            });
        }
    }

    _baconOrderService.Add(baconOrder);
    return RedirectToAction("Index");
}
public ActionResult Edit([Bind(Include = "Name")]Student student)
{
    ...
}
@{ var index = 0; } 
                @for (int i = 0; i < Model.Addons.Count; i++)
                {
                    if (Model.Addons[i].AddonType == AddonType.BaconStrips) // AddonType is enum.
                    {
                        <div>
                            @Html.Hidden("BaconAddons[" + index + "].Id", Model.Addons[i].Id)
                            @Html.Hidden("BaconAddons[" + index + "].AddonType", Model.Addons[i].AddonType)
                            @Html.Hidden("BaconAddons[" + index + "].Name", Model.Addons[i].Name)
                            @Html.Hidden("BaconAddons[" + index + "].Price", Model.Addons[i].Price)
                            @Html.TextBox("BaconAddons[" + index + "].Quantity", Model.Addons[i].Quantity, new { @style = "width: 40px", @class = "form-control calculated", data_price = Model.Addons[i].Price })
                            @Model.Addons[i].Name
                            @(" ($")@Model.Addons[i].Price@(")")
                        </div><br />
                        { index++; }
                    }
                }