📌  相关文章
📜  返回视图模型后未选中复选框值 - C# (1)

📅  最后修改于: 2023-12-03 15:28:19.483000             🧑  作者: Mango

返回视图模型后未选中复选框值 - C#

在开发过程中,我们经常需要在视图中使用复选框来让用户选择多个选项。但是,有时候当我们从视图模型中返回值时,未选中的复选框的值会被漏掉。这篇文章将会告诉你如何解决这个问题。

问题描述

假设我们有一个视图模型,其中包含一个复选框列表:

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,然后在控制器中手动计算每个复选框是否被选中。这样我们就可以在任何情况下正确地从视图中获取复选框值了。