📅  最后修改于: 2023-12-03 15:28:19.483000             🧑  作者: Mango
在开发过程中,我们经常需要在视图中使用复选框来让用户选择多个选项。但是,有时候当我们从视图模型中返回值时,未选中的复选框的值会被漏掉。这篇文章将会告诉你如何解决这个问题。
假设我们有一个视图模型,其中包含一个复选框列表:
public class MyViewModel
{
public List<Checkbox> Checkboxes { get; set; }
}
public class Checkbox
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
}
我们在视图中使用了这个复选框列表:
@foreach(var checkbox in Model.Checkboxes)
{
<input type="checkbox" name="checkboxes" value="@checkbox.Id" @(checkbox.IsSelected ? "checked" : "") /> @checkbox.Name<br />
}
当用户选择某个选项并提交表单时,我们将会得到一个包含所有选中复选框的值的表单集合。但是当用户不选中任何一个选项并提交表单时,表单集合中不会包含任何复选框的值。也就是说,我们的视图模型将会返回一个空的复选框列表。
对于这个问题,我们可以在控制器中添加一个隐藏的输入字段,这个字段的值被设置为复选框列表中所有选项的id。这样无论哪个复选框是否被选中,表单集合总是包含这个值。
我们在视图中添加这个隐藏字段:
@foreach(var checkbox in Model.Checkboxes)
{
<input type="checkbox" name="checkboxes" value="@checkbox.Id" @(checkbox.IsSelected ? "checked" : "") /> @checkbox.Name<br />
}
<input type="hidden" name="all_ids" value="@string.Join(",", Model.Checkboxes.Select(c => c.Id))" />
在控制器中,我们需要使用表单集合和视图模型中包含的所有id,手动计算每个复选框是否被选中:
[HttpPost]
public IActionResult Index(List<int> checkboxes, string all_ids)
{
var viewModel = new MyViewModel {
Checkboxes = new List<Checkbox>(),
};
foreach (var id in all_ids.Split(","))
{
var checkbox = new Checkbox {
Id = int.Parse(id),
Name = "...",
IsSelected = checkboxes.Contains(int.Parse(id)),
};
viewModel.Checkboxes.Add(checkbox);
}
return View(viewModel);
}
在这个示例中,我们首先使用字符串拆分方法将所有id分成一个数组。然后我们循环这个数组,创建每个复选框并给它设置相应的是否选中的状态。最后我们将这些复选框添加到视图模型的复选框列表中。
以上我们分析了当我们使用复选框列表时,未选中某一选项会导致视图模型中缺少值的问题,以及如何解决这个问题。最终我们使用了一个隐藏字段来存储所有的id,然后在控制器中手动计算每个复选框是否被选中。这样我们就可以在任何情况下正确地从视图中获取复选框值了。