【发布时间】:2017-06-07 22:17:07
【问题描述】:
背景 我们需要提交带有项目的模型。为此,我们制作了这个复杂的模型:
public class PaymentViewModel
{
public decimal? Payment { get; set; }
public string Description { get; set; }
public List<SplittedPaymentViewModel> SplittedPayment { get; set; } = new List<SplittedPaymentViewModel>();
}
public class SplittedPaymentViewModel
{
public short SplittedPaymentId { get; set; }
public decimal? Payment { get; set; }
public string Description { get; set; }
}
为了渲染html,我们这两个视图,一个常规的:CreatePayment
@model ZevApp.ViewModels.Record.PaymentViewModel
...
<input class="form-control" asp-for="Payment" type="number" />
<input class="form-control" asp-for="Description" />
...
<div class="panel-body" id="SplittedPayments">
@foreach (var spItem in Model.SplittedPayment)
{
@Html.Partial("SplittedPaymentPartial", spItem);
}
...
</div>
还有另一个部分:SplittedPaymentPartial
@model ZevApp.ViewModels.Record.SplittedPaymentViewModel
...
<input class="form-control" asp-for="Payment" type="number" />
<input class="form-control" asp-for="Description" />
...
如您所见,从第一个视图开始,我们称为部分视图,并从 SplittedPayment 列表中逐项传递它们。
意外行为 我们运行代码,但出现意外行为: 每个部分视图绑定 Payment 和 Description 表单父 PaymentViewModel,而不是来自传递的项目?
有人知道怎么回事吗?
每个视图在文件开头定义模型。
我们从控制器返回 PaymentViewModel,对于测试,有树 SplittedPaymentViewModel。但我们无法从项目中看到值。
【问题讨论】:
-
这里是test project 和用例步骤: 1. 运行项目,点击链接“CreatePayment”。初始化数据结合良好。 2. 点击提交按钮。 3. 渲染页面后,可以看到对于每一个SplittedPayment,Payment和Description都是从PaymentViewModel绑定的不形成 SplittedPayment。如果您在 public IActionResult CreatePayment(PaymentViewModel model) 的调试模式下设置断点,您可以看到该模型正常 - 它包含 2 个项目
-
这很奇怪!为什么不向 SplittedPaymentViewModel 添加新字段并将其绑定到局部视图中的输入? (或者您可以为此目的使用 Id。)因此您将确保视图输入绑定到正确的模型实例。
标签: asp.net-core-mvc