【问题标题】:MVC 5 remove ViewModel's list element with checkboxMVC 5 使用复选框删除 ViewModel 的列表元素
【发布时间】:2015-10-11 00:13:42
【问题描述】:

我有一个带有列表的 ViewModel 如何使用复选框删除列表元素?我在编辑操作中生成带有 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>

使用这段代码,我只能获取视图模型的值,但不能获取复选框,因为它们不是视图模型的一部分。

[HttpPost]
[ValidateAntiForgeryToken]
public override ActionResult Edit(int id, BouquetViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }
    DataService.Update(viewModel);
    return RedirectToAction("Details/" + id);
}

【问题讨论】:

  • 能否请您澄清您的问题。我不明白你的问题是什么=/
  • 我有一个表单,其中包含 viemodel 的值(如名称等),并且我为 viewmodel 的花卉列表生成带有列表项 ID 的复选框,我希望如果在提交后取消选中复选框,我会删除列表中未选中的项目。如何在 post 操作中到达不属于视图模型的复选框?

标签: c# asp.net-mvc checkbox asp.net-mvc-5


【解决方案1】:

目前您为每个复选框赋予不同的name 属性,因此假设您使用flower.Id=4flower.Id=8 选中复选框,那么您的表单数据将包含...4=on&amp;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 执行什么操作,因此有点不清楚您想要执行什么操作。

【讨论】:

    【解决方案2】:

    只有选中的选项才会发送到控制器。如果要查找未选中的选项,则需要将原始值与发布的值进行比较,然后您会找到“未选中”的选项。

    如果您不想这样做,可以使用@Html.CheckBox@Html.CheckBoxFor。除了渲染复选框输入元素外,该方法还渲染隐藏的输入元素,以便未选中的复选框返回false。

    看看: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.inputextensions.checkbox(v=vs.118).aspx

    【讨论】:

    • 嗯,是的,我在浏览器的开发人员工具中看到它在帖子中发送回服务器的内容,但是我怎样才能获得这些额外复选框的值,因为它们不是视图模型。
    • 使用第一次生成选项时使用的相同查询,Model.FlowerList。然后,将该列表与新列表进行比较,您会发现未选中的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2020-08-02
    • 2020-11-02
    相关资源
    最近更新 更多