ASP动作编辑未从剃须刀页面获取数据

时间:2020-06-07 20:45:27

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

我正在尝试提交包含复选框的表单。 提交表单时,我没有从表单中获取选定的数据。我一直在尝试使用as-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; }
    }
}

1 个答案:

答案 0 :(得分:0)

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

这意味着我们不能使用像<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"的含义,我们只能使用此"@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>

结果:

enter image description here

相关问题