public class SaleItem
{
public int Id { get; set; }
public string Name { get; set; }
}
public class SalesDBContext
{
public static List<SaleItem> GetItems()
{
var items = new List<SaleItem>(){
new SaleItem{Id=1,Name="Soap"},
new SaleItem{Id=2,Name="Milk Power"},
new SaleItem{Id=3,Name="Toothpaste"},
new SaleItem{Id=4,Name="Ice Cream"}
};
return items.ToList();
}
}
public class SalesViewModel
{
public string Item { get; set; }
public List<SaleItem> itemlist { get; set; }
}
我有一个名为SalesViewModel
的类和一个用于生成虚拟数据的SalesDBContext
。我想从下拉列表中选择项目并将其添加到列表中。为此,我创建了以下视图:
@model MVCDropdown.Models.SalesViewModel
@using MVCDropdown.Models
<form method="post">
<p>
@Html.DropDownListFor(model => model.Item, new SelectList(ViewBag.Items, "Id", "Name"), "--select--")
<input type="submit" value="Add" />
</p>
<p>
@if (Model.itemlist != null)
{
<table>
@foreach (var s in Model.itemlist)
{
<tr>
<td>@s.Name</td>
</tr>
}
</table>
}
</p>
</form>
控制器
[HttpGet]
public ActionResult Index()
{
SalesViewModel model = new SalesViewModel
{
Item = "",
itemlist = new List<SaleItem>()
};
PopDrodown();
return View(model);
}
[HttpPost]
public ActionResult Index(SalesViewModel vm)
{
var t = SalesDBContext.GetItems().Where(x => x.Id == Convert.ToInt32(vm.Item)).FirstOrDefault();
vm.itemlist.Add(t);
PopDrodown();
return View(vm);
}
private void PopDrodown()
{
ViewBag.Items = SalesDBContext.GetItems();
}
- 在下拉列表下方应以表格形式显示添加到列表中的项目。
- 但是,当我通过按“添加”将选择的项目从下拉列表提交后,在返回到控制器时,它会返回一个空的
itemlist
,之前添加的项目不复存在。如何避免这个问题?
if (vm.itemlist == null) vm.itemlist = new List<SaleItem>(); vm.itemlist.Add(t);
来避免这个错误。但是,你能告诉我为什么不能使用 foreach 循环吗? - Daybreakerforeach
循环,将无法生成正确的隐藏字段name
属性。您需要在标记中包含以下内容:<input type="hidden" name="itemlist[0].Id" value="1" />
,...我邀请您阅读以下博客文章:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/,以更好地熟悉ASP.NET MVC模型绑定器期望传入数据的电线格式,以重新填充您的视图模型集合。 - Darin Dimitrov