Asp.net razor textbox array for list items
Try it this way:
view:
@for (int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(x=>Model[i].Id) @Model[i].Name
@Html.TextBoxFor(x => Model[i].Quantity) <br/>
}
model:
public class CupcakeViewModel
{
public int Id {get;set;}
public string Name {get;set;}
public int Quantity {get;set;}
}
controller:
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
}
You have to use an index, rather than foreach
for it to work.
@for (int i = 0; i < Model.CupcakeList.Count; i++)
{
@Html.TextBoxFor(x=>Model.CupcakeQuantities[i]) @Model.CupcakeList[i].Name <br/>
}
This will create sequentially named+number entries that will be recombined back into the model on post back.
I realise this may seem like "why doesn't foreach work?", but with foreach
there is not enough reflected information available to TextBoxFor
(as it is just a single object), whereas the array index is extracted by reflection from the Model.CupcakeQuantities[i]
expression.
The receiving controller method should take the same as the model passed to the view:
e.g.
[HttpPost]
public ActionResult(PartyBookingModel model)