![](/img/trans.png)
[英]ASP.NET MVC After Post Back List that contains List property in ViewModel is null
[英]ViewModel post back a null Collection in asp.net mvc 5
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
控制器,和以前添加的項目是不存在的。 如何避免這個問題?
HTML表單中只有一個輸入元素:這是下拉列表。 因此,提交表單時發送給控制器操作的唯一值是Item
屬性。 如果要發送集合,可以使用隱藏字段:
<table>
@for (var i = 0; i < Model.itemlist.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(x => x.itemlist[i].Id)
@Html.HiddenFor(x => x.itemlist[i].Name)
@Html.DisplayFor(x => x.itemlist[i].Name)
</td>
</tr>
}
</table>
顯然,如果用戶不應該在HTML表單中編輯值,那么更好的方法是使用POST視圖模型,該模型僅包含用戶可以修改的屬性,並且可以從同一位置檢索集合元素您在GET操作中檢索了它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.