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

问题描述

在我看来,我有类似的标记

@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>

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

视图如下所示:

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));
    } 

我希望我的代码根据来自复选框的信息执行某些操作,现在我试图查看视图中的所有数据是否都作为选择列表发送,但这不是情况,因为此代码不会在调试屏幕中打印除“测试”之外的任何内容

我已经完成了我的研究,人们推荐了以下链接来了解如何在控制器中加载相关数据。

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??)

当然没有帮助(编写该代码对我来说非常混乱,我在理解它的作用时遇到了问题)。

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

解决方法

我想从视图中访问两组复选框及其选定的值

请注意,您没有为这些复选框输入指定 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
    //...

模型类ModelOfCheckedVals

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

测试结果

enter image description here