ViewModel 未将数据返回到 Post 方法

ViewModel Not returning data to Post method

我正在使用 ASP.Net Core 5.0

我有一个视图模型 -

using YellowFeverPortal.Web.Models;
using System.Collections.Generic;
using System.Linq;

namespace YellowFeverPortal.Web.ViewModels
{
    public class RegistrationListViewModel
    {
        public List<Registration> allRegistrations { get; set; }

        public Registration theRegistration { get; set; }

        public Registration theFirstRegistration { get; set; }

        public int clinicId { get; set; }

        public string clinicShortCode { get; set; }
    }
}

我有一个使用视图模型的剃刀视图 -

@model RegistrationListViewModel
@{
    ViewData["Title"] = "Registration";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<form method="post" asp-controller="registration" asp-action="registration">
    <div class="card border border-1">
        <div class="card-header font-weight-bold">
            @Model.vaccinationClinicShortCode - Current Registration
            <button type="button" class="btn-sm btn-primary float-right" onClick="history.go(-1); return false;" title="Click to confirm designation renewals">Back</button>
        </div>
    </div>

    <div class="form">
        <div asp-validation-summary="ModelOnly"></div>

        <input id="vaccClinicId" asp-for="vaccinationClinicId" class="form-control" style="display:none" />
        <input id="vaccClinicShortCodeId" asp-for="vaccinationClinicShortCode" class="form-control" style="display:none" />
        <input id="regId" asp-for="theRegistration.Id" class="form-control" style="display:none" />
        <input id="regsId" asp-for="allRegistrations" class="form-control" style="display:none" />

        <fieldset class="form-group">
            <div class="form-row mt-2 ml-2">
                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.CodeOfPracticeReceived" class="control-label">Code of Practice Received</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="codeOfPracRecvdId" type="checkbox" asp-for="theRegistration.CodeOfPracticeReceived" />
                    <span asp-validation-for="theRegistration.CodeOfPracticeReceived" class="text-danger"></span>
                </div>

                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.CertificateSent" class="control-label">Certificate Sent</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="certSentId" type="checkbox" asp-for="theRegistration.CertificateSent" />
                    <span asp-validation-for="theRegistration.CertificateSent" class="text-danger"></span>
                </div>
            </div>

            <div class="form-row ml-2">
                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.RegisteredAt" class="control-label">Designation Date</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="registeredAtId" type="date" asp-for="theRegistration.RegisteredAt" />
                    <span asp-validation-for="theRegistration.RegisteredAt" class="text-danger"></span>
                </div>

                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.CertificateSentAt" class="control-label">Certificate Sent Date</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="certSentDateId" type="date" asp-for="theRegistration.CertificateSentAt" />
                    <span asp-validation-for="theRegistration.CertificateSentAt" class="text-danger"></span>
                </div>
            </div>

            <div class="form-row ml-2">
                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.InvoiceNumber" class="control-label">Invoice Number</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="invoiceNumberId" asp-for="theRegistration.InvoiceNumber" />
                    <span asp-validation-for="theRegistration.InvoiceNumber" class="text-danger"></span>
                </div>

                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.SanofiInformed" class="control-label">Sanofi Informed</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="sanofiInformedId" type="checkbox" asp-for="theRegistration.SanofiInformed" />
                    <span asp-validation-for="theRegistration.SanofiInformed" class="text-danger"></span>
                </div>
            </div>

            <div class="form-row ml-2">
                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.InvoiceSentAt" class="control-label">Invoice Date</label>
                </div>
                <div class="col-md-3 mb-2">
                    <input id="invoiceSentAtId" type="date" asp-for="theRegistration.InvoiceSentAt" />
                    <span asp-validation-for="theRegistration.InvoiceSentAt" class="text-danger"></span>
                </div>

                <div class="col-md-3 mb-2">
                    <label asp-for="theRegistration.NumberOfYearsId" class="control-label">Number of Years to Renewal</label>
                </div>
                <div class="col-md-3 mb-2">
                    <select id="numOfYearsId" asp-for="theRegistration.NumberOfYearsId" asp-items="@(new SelectList(ViewBag.NumberOfYearsList, "Id", "TheNumberOfYears"))" style="height: 37px;">
                        <option value='0' className='display-none'>Please Select...</option>
                    </select>
                    <span asp-validation-for="theRegistration.NumberOfYearsId" class="text-danger"></span>
                </div>
            </div>

            <div class="form-row">
                <div class="col-md-12 mb-2">
                    <input type="submit" value="Submit" name="Submit" class="btn btn-success float-right" id="SubmitForm" />
                </div>
            </div>
        </fieldset>

        <div class="card border border-1">
            <div class="card-header font-weight-bold">
                First Registration
            </div>
        </div>

        <fieldset class="form-group">
            <table class="table table-bordered table-striped table-hover" style="border: 1px solid darkgray">
                <thead>
                    <tr>
                        <td>Designation Form Received</td>
                        <td>Code Of Practice Received</td>
                        <td>Designation Date</td>
                        <td>Certificate Sent</td>
                        <td>Certificate Sent Date</td>
                        <td>Invoice Number</td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td class="text-center">@Model.theFirstRegistration.RegistrationFormReceived</td>
                        <td class="text-center">@Model.theFirstRegistration.CodeOfPracticeReceived</td>
                        <td class="text-center">@(Model.theFirstRegistration.RegisteredAt.HasValue ? Model.theFirstRegistration.RegisteredAt.Value.ToString("dd/MM/yyyy") : "")</td>
                        <td class="text-center">@Model.theFirstRegistration.CertificateSent</td>
                        <td class="text-center">@(Model.theFirstRegistration.CertificateSentAt.HasValue ? Model.theFirstRegistration.CertificateSentAt.Value.ToString("dd/MM/yyyy") : "")</td>
                        <td class="text-center">@Model.theFirstRegistration.InvoiceNumber</td>
                    </tr>
                </tbody>
            </table>
        </fieldset>

        <div class="card border border-1">
            <div class="card-header font-weight-bold">
                Subsequent Registrations
            </div>
        </div>

        <!--
    <fieldset class="form-group">
        <table class="table table-bordered table-striped table-hover" style="border: 1px solid darkgray">
            <thead>
                <tr>
                    <td>Code Of Practice Received</td>
                    <td>Designation Date</td>
                    <td>Certificate Sent</td>
                    <td>Certificate Sent Date</td>
                    <td>Invoice Number</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    @for (int i = 0; i < Model.allRegistrations.Count(); i++)
                    {
                        if (Model.allRegistrations[i].RegisteredAt != Model.theFirstRegistration.RegisteredAt && Model.allRegistrations[i].RegisteredAt != Model.theRegistration.RegisteredAt)
                        {
                            <td class="text-center">@Model.allRegistrations[i].CodeOfPracticeReceived</td>
                            <td class="text-center">@(Model.allRegistrations[i].RegisteredAt.HasValue ? Model.allRegistrations[i].RegisteredAt.Value.ToString("dd/MM/yyyy") : "")</td>
                            <td class="text-center">@Model.allRegistrations[i].CertificateSent</td>
                            <td class="text-center">@(Model.allRegistrations[i].CertificateSentAt.HasValue ? Model.allRegistrations[i].CertificateSentAt.Value.ToString("dd/MM/yyyy") : "")</td>
                            <td class="text-center">@Model.allRegistrations[i].InvoiceNumber</td>
                        }
                    }
                </tr>
            </tbody>
        </table>
    </fieldset> -->
    </div>

</form>

我的控制器中有一个 post 方法 -

 [HttpPost]
 [ValidateAntiForgeryToken]
 public IActionResult Registration(RegistrationListViewModel registrationListViewModel)
 {
    if (!ModelState.IsValid)
    {
       return View("Registration", registrationListViewModel);
    }

    if (registrationListViewModel.allRegistrations is null || registrationListViewModel.allRegistrations.Count() == 0)
    {
       _registrationRepository.CreateRegistration(registrationListViewModel.theRegistration);            
    }
    else
    {          
       _registrationRepository.UpdateRegistration(registrationListViewModel.theRegistration);     
    }

    return View(registrationListViewModel);
 }

当我按下提交按钮时,allRegistrations 的数量为 0。应该是 1。这是传递给视图的 allRegistrations 的数量。

我什至有一个设置为 allRegistrations 的输入标签,但这没有区别,它仍然是 returns 0 allRegistrations。

知道为什么吗?

谢谢

对于 集合 简单类型的目标,模型绑定会查找 parameter_name 或 property_name[=30= 的匹配项].如果未找到匹配项,它会查找一种不带前缀的受支持格式

  1. 换句话说,您需要表单中的 input name 类似于allRegistrations[0].RegistrationFormReceived”。
  2. 这样,提交表单后就可以成功绑定数据到allRegistrations

代码:

<input hidden asp-for="@Model.allRegistrations[0].RegistrationFormReceived">
<input hidden asp-for="@Model.allRegistrations[0].CodeOfPracticeReceived">
<input hidden asp-for="@Model.allRegistrations[0].RegisteredAt">
<input hidden asp-for="@Model.allRegistrations[0].CertificateSent">
<input hidden asp-for="@Model.allRegistrations[0].CertificateSentAt">
<input hidden asp-for="@Model.allRegistrations[0].InvoiceNumber">

输出html字符串:

<input hidden="" type="text" id="allRegistrations_0__RegistrationFormReceived" name="allRegistrations[0].RegistrationFormReceived" value="RegistrationFormReceived">
<input hidden="" type="text" id="allRegistrations_0__CodeOfPracticeReceived" name="allRegistrations[0].CodeOfPracticeReceived" value="CodeOfPracticeReceived">
<input hidden="" type="datetime-local" id="allRegistrations_0__RegisteredAt" name="allRegistrations[0].RegisteredAt" value="2021-06-23T13:58:22.875">
<input hidden="" type="text" id="allRegistrations_0__CertificateSent" name="allRegistrations[0].CertificateSent" value="CertificateSent">
<input hidden="" type="datetime-local" id="allRegistrations_0__CertificateSentAt" name="allRegistrations[0].CertificateSentAt" value="2021-06-23T13:58:22.876">
<input hidden="" type="text" id="allRegistrations_0__InvoiceNumber" name="allRegistrations[0].InvoiceNumber" value="InvoiceNumber">