用于列表项的Asp.net razor文本框数组

本文关键字:razor 文本 数组 net Asp 列表 用于 | 更新日期: 2023-09-27 18:08:15

我无法找到或弄清楚如何将项目(纸杯蛋糕)列表显示在带有数量字段的razor中。

问题是我无法得到列表中每个纸杯蛋糕数量的值。你能在Razor中做文本框数组吗?

视图

<div class="form-group">
    <label>Cupcakes</label>
    @foreach (var cupcake in Model.CupcakeList)
    {
        @Html.TextBox("CupcakeQuantities", cupcake.Id)  @cupcake.Name <br/>
    }
</div>

模型
public List<Cupcake> CupcakeList { get; set; }
public List<int> CupcakeQuantities { get; set; }
控制器

public ActionResult Create()
{
    var model = new PartyBookingModel()
    {
        CupcakeList = db.Cupcakes.ToList(),
        CupcakeQuantities = new List<int>()
    };
    return View(model);
}

蛋糕(实体)

public class Cupcake
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal PerDozen { get; set; }
}

用于列表项的Asp.net razor文本框数组

您必须使用索引,而不是foreach才能工作。

@for (int i = 0; i < Model.CupcakeList.Count; i++)
{
    @Html.TextBoxFor(x=>Model.CupcakeQuantities[i]) @Model.CupcakeList[i].Name <br/>
}

这将创建顺序命名的+number条目,这些条目将在post back时重新组合回模型中。

我意识到这可能看起来像"为什么不foreach工作?",但是foreach没有足够的反射信息提供给TextBoxFor(因为它只是一个对象),而数组索引是通过反射从Model.CupcakeQuantities[i]表达式中提取的。

接收控制器方法应该与传递给视图的模型相同:

[HttpPost]
public ActionResult(PartyBookingModel model)

试试这样做:

视图:

@for (int i = 0; i < Model.Count; i++)
{
    @Html.HiddenFor(x=>Model[i].Id) @Model[i].Name  
    @Html.TextBoxFor(x => Model[i].Quantity) <br/>
}

模型:

public class CupcakeViewModel
{
   public int Id {get;set;}
   public string Name {get;set;}
   public int Quantity {get;set;}   
}

控制器:

public ActionResult Create()
{
    var model = db.Cupcakes.Select(c => new CupcakeViewModel {
                                                Id = c.Id,
                                                Name = c.Name,
                                                Quantity = 0 
                           })
                           .ToList();
    return View(model);
}
[HttpPost]
public ActionResult Create(CupcakeViewModel[] cakes)
{
     //Save choosen cakes
}