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= 的匹配项].如果未找到匹配项,它会查找一种不带前缀的受支持格式。
- 换句话说,您需要表单中的 input name 类似于 “allRegistrations[0].RegistrationFormReceived”。
- 这样,提交表单后就可以成功绑定数据到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">
我正在使用 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= 的匹配项].如果未找到匹配项,它会查找一种不带前缀的受支持格式。
- 换句话说,您需要表单中的 input name 类似于 “allRegistrations[0].RegistrationFormReceived”。
- 这样,提交表单后就可以成功绑定数据到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">