ASP.NET 核心:我想从控制器方法的视图中访问复选框列表(值)

ASP.NET Core: I want to have access to the list of checkboxes (value) from my view on my controller's method

在我看来,我有类似这样的标记:

@model C.Models.CM
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div class="form-group">
                <label asp-for="Date" class="control-label"></label>
                <input asp-for="Date" class="form-control" />
                <span asp-validation-for="Date" class="text-danger"></span>
            </div>

            <div class="row">
                <select data-placeholder="Select Item" asp-for="IdItem" class="form-control" asp-items="ViewBag.Items"></select>
            </div>

            <div class="form-group">
                <input id="cboAll" type="checkbox" value="CheckAll / unCheck" /> All<br />
                @foreach (var cdos in ViewBag.Modelon.Cdos)
                { 
                    <input id=@cdos.Id type="checkbox" value=@cdos.Id class="w3-check" />@cdos.Name<br />
                }
            </div>

            <div class="form-group">
                <input id="cboAll" type="checkbox" value="CheckAll / unCheck" /> All<br />
                @foreach (var ctres in ViewBag.Modelon.Ctres)
                {
                    <input id=@ctres.Id type="checkbox" value=@ctres.Id class="w3-check" />@ctres.Name<br />
                }
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

这里要理解的重要一点是,除了视图中的其他附加信息之外,此标记生成的数字 N CheckBox 取决于数据库中插入的数据。

视图如下所示:

My View

因此,正如您所看到的,CheckBox 的数量从 1 变为 N。

我的问题如下,我无法理解如何在我的控制器中获取 CheckBox 组数据。我什至不知道这些信息是否真的被发送到控制器。

我的控制器中有以下代码:

    public async Task<IActionResult> Create(List<string> slct)
    {
        System.Diagnostics.Debug.WriteLine("test");

        foreach (string value in slct)
        {
            System.Diagnostics.Debug.WriteLine(value);
        };

        System.Diagnostics.Debug.WriteLine("test");

        return RedirectToAction(nameof(Index));
    } 

我希望我的代码根据来自复选框的信息做某些事情,现在我试图查看视图中的所有数据是否都作为 select 列表发送,但事实并非如此,因为除了“测试”之外,此代码不会在调试屏幕中打印任何内容。

我做了研究,人们推荐了以下链接来学习如何在控制器中加载相关数据。

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/read-related-data?view=aspnetcore-5.0

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/update-related-data?view=aspnetcore-5.0

问题是无论我读了多少教程,我都无法理解它们或解决如何将它们应用到我的案例中,因为它们使用的是一个复杂得多的示例,而且代码我需要使用的是类型

await _context.Model.Include(a => a.Thing1)
                    .Include(b => b.Thing2) 
                    .ThenInclude(c => c.Whatiscwhatisbwat??)

当然没有帮助(编写该代码对我来说非常混乱,我无法理解它的作用)。

那么,好吧,有人可以帮我提供比教程中的解释更简单的解释来解决这个问题吗?在我从控制器中提到的方法中,我想以任何格式(如列表、数组等)访问视图中的两组复选框及其 selected 值,我知道我必须实现一个包含代码,但我不知道该怎么做,或者是否有更简单的解决方案。

I want to have access to the two groups of checkboxes from the view and their selected values

请注意,您没有为这些复选框输入指定 name 属性,这将导致所有选中的值都不会发布到服务器端。

为了达到您的上述要求,您可以修改如下代码。

为复选框指定 name 属性

<div class="form-group">
    <input id="cboAll" type="checkbox" value="CheckAll / unCheck" /> All<br />
    @foreach (var cdos in ViewBag.Modelon.Cdos)
    {
        <input id=@cdos.Id type="checkbox" name="selectedCdos" value=@cdos.Id class="w3-check" />@cdos.Name<br />
    }
</div>

<div class="form-group">
    <input id="cboAll" type="checkbox" value="CheckAll / unCheck" /> All<br />
    @foreach (var ctres in ViewBag.Modelon.Ctres)
    {
        <input id=@ctres.Id type="checkbox" name="selectedCtres" value=@ctres.Id class="w3-check" />@ctres.Name<br />
    }
</div>

接受检查值作为参数的操作方法

public async Task<IActionResult> Create(ModelOfCheckedVals slct)
{
    //...
    //code logic here
    //...

型号classModelOfCheckedVals

public class ModelOfCheckedVals
{
    public List<int> selectedCdos { get; set; }
    public List<int> selectedCtres { get; set; }
}

测试结果