首页 > 解决方案 > Asp-action 编辑未从剃刀页面获取数据

问题描述

我试图提交一个包含复选框的表单。当我提交表单时,我没有从表单中获取选定的数据。我一直在尝试使用 asp-for,但我不明白我做错了什么。

这是我的剃须刀页面:

@model TheaterReservering.Models.KlantReservering

@{
    ViewData["Title"] = "Edit";
}

<h1>Edit</h1>

<h4>Reservering voor: @Model.Klant.Naam</h4>

<form asp-action="Edit">
    <input type="hidden" asp-for="Klant" />
    <table class="table">
        <thead>
            <tr>
                <th>
                    1
                </th>
                <th>
                    2
                </th>
                <th>
                    3
                </th>
                <th>
                    4
                </th>
                <th>
                    5
                </th>
                <th>
                    6
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @{
                var count = 0;
            }
            @foreach (var item in Model.Reserveringen)
            {
                if ((count % 6) == 0)
                {
                    @:<tr>
                    }

                    <td style="text-align:center; vertical-align:middle">
                        <div class="form-group">
                            @if (item.KlantId == Model.Klant.Id)
                            {
                                <input type="checkbox" asp-for="Reserveringen.ElementAt(count).Bezet" checked />
                                <br />
                                <div style="background-color: blue; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                            else if (item.KlantId == null)
                            {
                                <input type="checkbox" asp-for="Reserveringen.ElementAt(count).Bezet" />
                                <br />
                                <div style="background-color: green; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                            else
                            {
                                <input type="checkbox" checked disabled />
                                <br />
                                <div style=" background-color: red; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                        </div>
                    </td>

                    if ((count % 6) == 5)
                    {
                    @:</tr>
                }
                count++;
            }
        </tbody>

    </table>
    <div class="form-group">
        <input type="submit" value="Reserveringen vastleggen" class="btn btn-primary" />
    </div>
</form>

我的控制器方法:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("Klant,Reserveringen")] KlantReservering klantReservering)
        {
            if (id != klantReservering.Klant.Id)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {

                _context.Update(klantReservering);
                await _context.SaveChangesAsync();


                return RedirectToAction(nameof(Index));
            }
            return View(klantReservering);
        }

这是我创建的类,用于将 Klant 类与 Reservering 结合起来。

    public class KlantReservering
    {
        public Klant Klant { get; set; }
        public List<Reservering> Reserveringen { get; set; }
    }
}

标签: asp.net-mvcasp.net-core

解决方案


据我所知,标签助手不能用于模型类,它只能用于模型的属性。

这意味着我们不能像这样使用标签助手<input type="hidden" asp-for="Klant" />。如果我们想在控制器方法中实现模型绑定。我建议您可以添加所有属性,如下所示:

<input type="hidden" asp-for="@Model.Klant.Id" />
<input type="hidden" asp-for="@Model.Klant.Naam" />

此外,对于 foreach 项,标签助手无法弄清楚是什么"Reserveringen.ElementAt(count).Bezet"意思,我们只能使用 this "@Model.Reserveringen[count].Bezet"

更多细节,您可以参考下面的示例视图:

注意:由于我不知道您关于 Klant 和 Reserveringen 类的详细信息代码,因此我在我身边创建了一个仅包含 Naam 和 Id 属性的测试类。

@model CoreNormalIssue.Models.KlantReservering
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@


@{
    ViewData["Title"] = "Edit";
}

<h1>Edit</h1>

<h4>Reservering voor: @Model.Klant.Naam</h4>

<form asp-controller="Verify" asp-action="Edit" method="post" asp-route-id="@Model.Klant.Id">

    <input type="hidden" asp-for="@Model.Klant.Id" />
    <input type="hidden" asp-for="@Model.Klant.Naam" />

    <table class="table">
        <thead>
            <tr>
                <th>
                    1
                </th>
                <th>
                    2
                </th>
                <th>
                    3
                </th>
                <th>
                    4
                </th>
                <th>
                    5
                </th>
                <th>
                    6
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @{
                var count = 0;
            }





            @foreach (var item in Model.Reserveringen)
            {

                <input type="text" asp-for="@item.Bezet" />

                if ((count % 6) == 0)
                {
                    @:<tr>
                    }

                    <td style="text-align:center; vertical-align:middle">
                        <div class="form-group">
                            @if (item.KlantId == Model.Klant.Id)
                            {
                                <input type="checkbox" asp-for="@Model.Reserveringen[count].Bezet" checked />
                                <br />
                                <div style="background-color: blue; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                            else if (item.KlantId == null)
                            {
                                <input type="checkbox" asp-for="@Model.Reserveringen[count].Bezet" />
                                <br />
                                <div style="background-color: green; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                            else
                            {
                                <input type="checkbox" checked disabled />
                                <br />
                                <div style=" background-color: red; text-align: center">
                                    <label style="color:white" asp-for="@item.Naam">@item.Naam</label>
                                </div>
                            }
                        </div>
                    </td>

                    if ((count % 6) == 5)
                    {
                    @:</tr>
                }
                count++;
            }
        </tbody>

    </table>
    <div class="form-group">
        <input type="submit" value="Reserveringen vastleggen" class="btn btn-primary" />
    </div>
</form>

结果:

在此处输入图像描述


推荐阅读