【问题标题】:ViewModel Not returning data to Post methodViewModel 不向 Post 方法返回数据
【发布时间】:2021-06-22 16:26:23
【问题描述】:

我正在使用 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 的输入标签,但这没什么区别,它仍然返回 0 allRegistrations。

有什么想法吗?

谢谢

【问题讨论】:

  • 您是否尝试删除 if (Model.allRegistrations[i].RegisteredAt != Model.theFirstRegistration.RegisteredAt && Model.allRegistrations[i].RegisteredAt != Model.theRegistration.RegisteredAt) ?跨度>

标签: asp.net-core model-view-controller


【解决方案1】:

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

  1. 换句话说,您需要表单中的输入 名称 类似于 "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">

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2021-05-29
    • 2017-06-05
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多