我有一个带有列表的ViewModel,如何使用复选框删除列表元素?我在edit动作中生成了带有foreach的复选框,但是如何在带有HttpPost的ViewModel旁边获取复选框的值?
<dl>
@foreach (var flower in Model.FlowerList)
{
<dt><input type="checkbox" id="@flower.Id" name="@flower.Id"/></dt>
<dd>@flower.Name</dd>
}
</dl>
放下这段代码,我只能获取viewmodel的值,而不能获取复选框的值,因为它们不是viewmodel的一部分。
[HttpPost]
[ValidateAntiForgeryToken]
public override ActionResult Edit(int id, BouquetViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View(viewModel);
}
DataService.Update(viewModel);
return RedirectToAction("Details/" + id);
}
目前,你给每个复选框不同的name
属性,所以假设你检查复选框与flower.Id=4
和flower.Id=8
那么你的表单数据将包括...4=on&8=on...
这是非常无用
一种选择是使用
@foreach (var flower in Model.FlowerList)
{
<input type="checkbox" name="selectedflowers" value="@flower.Id" /> // id not necessary
@flower.Name</dd>
}
然后向您的方法添加一个参数(假设flower.Id
是typeof int
)
public override ActionResult Edit(int id, BouquetViewModel viewModel int[] SelectedFlowers)
并且该参数SelectedFlowers
将包含所选Id
的的集合
但是,由于使用视图模型,更好的方法是在视图模型中添加一个布尔属性,以便可以将复选框绑定到该模型。您尚未显示模型,但假设它们是
public class BouquetViewModel
{
....
public List<FlowerViewModel> FlowerList { get; set; }
}
public class FlowerViewModel
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; } // add this
}
然后在视图中(请注意,您必须使用for
循环而不是foreach
循环)
for (int i = 0, i < Model.FlowerList.Count; i++)
{
@Html.HiddenFor(m => m.FlowerList[i].ID)
@Html.CheckBoxFor(m => m.FlowerList[i].IsSelected)
@Html.LabelFor(m => m.FlowerList[i].IsSelected, Model.FlowerList[i].Name)
}
然后在POST方法中,您可以使用
IEnumerable<FlowerViewModel> selectedFlowers = viewModel.FlowerList.Where(f => f.IsSelected);
旁注:没有在POST方法代码中的任何位置指示您要对所选ID进行的操作,因此它不清楚您要进行的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句