ASP.Net MVC索引输入没有绑定到POST上的模型
本文关键字:POST 模型 绑定 MVC Net 索引 输入 ASP | 更新日期: 2023-09-27 18:16:44
我正试图将数据发送回我的控制器,但模型列表总是以null返回。
我已经检查了渲染的html,它似乎对我有效,但也许我错过了一些东西。以前从未这样做过,我想如果输入与模型匹配,那么它将自动绑定。
<Razor视图/strong>
@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 />
}
}
生成的HTML
<div class="form-group" id="FoodPlatter">
<input class="form-control calculated" data-price="30.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_32__Quantity" name="Addons[32].Quantity" style="width: 40px" type="text" value="0">
<input class="form-control calculated" data-price="21.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_33__Quantity" name="Addons[33].Quantity" style="width: 40px" type="text" value="0">
<input class="form-control calculated" data-price="30.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_34__Quantity" name="Addons[34].Quantity" style="width: 40px" type="text" value="0">
</div>
public class BaconOrderModel {
public List<Addon> Addons { get; set; }
}
领域strong>
public class Addon
{
public int Id { get; set; }
public AddonType AddonType { get; set; } // ENUM
public string Name { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public bool IsSelected { get; set; }
}
控制器
[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开始,并且是顺序的
作为对你上次评论的回答:
我认为默认绑定模型就是这样工作的。关于模型绑定的介绍,请参阅http://msdn.microsoft.com/en-us/magazine/hh781022.aspx。
您可以使用此语法包含/排除属性,这也有助于降低恶意攻击的风险。
public ActionResult Edit([Bind(Include = "Name")]Student student)
{
...
}
大多数时候,我使用简单的视图模型,它只携带它们需要的数据。
经过几次尝试和下面的建议,我意识到这里的根本问题是索引。挑战在于,我的列表是按类型(enum)分组的,并且我按此枚举类型呈现表单的每个部分。因为我在主列表中获取值的位置索引不是按顺序排列的。目前我已经修复了问题如下;
@{ var index = 0; }
EACH SECTION (ADDONTYPE)
@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++; }
}
}
我想知道这是不是最好的方法?我试图在我的模型中创建另一个空列表来绑定,但它似乎抛出了一个"超出范围"的异常。我很想知道是否有更好的方法?