【问题标题】:ASP.Net MVC 6 PartialView model binding confusionASP.Net MVC 6 PartialView 模型绑定混淆
【发布时间】: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 列表中逐项传递它们。

意外行为 我们运行代码,但出现意外行为: 每个部分视图绑定 PaymentDescription 表单父 PaymentViewModel,而不是来自传递的项目?

有人知道怎么回事吗?

每个视图在文件开头定义模型。

我们从控制器返回 PaymentViewModel,对于测试,有树 SplittedPaymentViewModel。但我们无法从项目中看到值。

【问题讨论】:

  • 这里是test project 和用例步骤: 1. 运行项目,点击链接“CreatePayment”。初始化数据结合良好。 2. 点击提交按钮。 3. 渲染页面后,可以看到对于每一个SplittedPaymentPaymentDescription都是从PaymentViewModel绑定的不形成 SplittedPayment。如果您在 public IActionResult CreatePayment(PaymentViewModel model) 的调试模式下设置断点,您可以看到该模型正常 - 它包含 2 个项目
  • 这很奇怪!为什么不向 SplittedPaymentViewModel 添加新字段并将其绑定到局部视图中的输入? (或者您可以为此目的使用 Id。)因此您将确保视图输入绑定到正确的模型实例。

标签: asp.net-core-mvc


【解决方案1】:

我发现问题是 CreatePayment.cshtml(感谢 MVC 社区的人们)。在调用局部视图时,它不提供有关 spItem 表达式的任何信息。

var savePrefix = ViewData.TemplateInfo.HtmlFieldPrefix;
for (var i = 0; i < Model.SplittedPayment.Count; i++)
{
  ViewData.TemplateInfo.HtmlFieldPrefix = Html.NameFor(m => m.SplittedPayment[i]);

  var spItem = Model.SplittedPayment[i];
  @Html.Partial("SplittedPaymentPartial", spItem);

  ViewData.TemplateInfo.HtmlFieldPrefix = savePrefix;
}

你可以在https://github.com/aspnet/Mvc/issues/4106找到完整的描述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多