视图模型对象子对象在开机自检时为空

本文关键字:对象 开机自检 模型 视图 | 更新日期: 2023-09-27 18:30:41

我有一个视图模型,有两个属性,一个是POCO类,另一个是双精度,当控制器构建并发送视图模型时,所有值都存在并在页面上工作。当我 POST 视图模型时,设置了双精度值,并且对象存在,但里面的 POCO 类为 null,这在发送对象时不是。

在下面的示例中,为什么 POST 视图模型对象上的ticket.flight为空?

视图模型:

public class PayViewModel
{
    public virtual Ticket ticket { get; set; }
    public double amountToPay = 0.0;
    [Display(Name = "Amount To Pay")]
    [DataType(DataType.Currency)]
    [DisplayFormat(DataFormatString = "{0:N2}", ApplyFormatInEditMode = true)]
    public double AmountToPay
    {
        get
        {
            return amountToPay;
        }
        set
        {
            amountToPay = value;
        }
    }
}

控制器方法:

// GET: Tickets/Pay/5
public ActionResult Pay(int? id)
{
    if (id == null)
    {
        return RedirectToAction("Index");
    }
    Ticket ticket = db.tickets.Find(id);
    if (ticket == null)
    {
        return RedirectToAction("Index");
    }
    PayViewModel viewModel = new PayViewModel();
    viewModel.ticket = ticket;
    return View(viewModel);
}
// POST: Tickets/Pay/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Pay([Bind(Include = "AmountToPay,ticket,ticket.flight")]PayViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        viewModel.ticket.AmountPaid += viewModel.AmountToPay;
        if (viewModel.ticket.AmountPaid >= viewModel.ticket.flight.ticketPrice)
        {
            viewModel.ticket.status = TicketStatusType.CONFIRMED;
        }
        db.Entry(viewModel.ticket).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(viewModel.ticket);
}

查看代码 - https://gist.github.com/JonFriesen/f511a91b8e9a90c1b23c

视图模型对象子对象在开机自检时为空

在表单提交过程中,浏览器仅提交类型为 input 的字段。这意味着从您的视图中,只有这些语句创建输入类型的字段:

@Html.HiddenFor(model => model.ticket.id)
@Html.EditorFor(model => model.AmountToPay, new { htmlAttributes = new { @class = "form-control" } })

当请求到达 MVC 应用程序时,绑定使用到达的值ticket.idAmountToPay来构造 PayViewModel 类型的对象。由于它无法从提交的值中找到ticket.flight中的任何属性,因此它假定它不应该存在,因此为其分配了默认值 null 。这是模型绑定器的预期行为。

如果你想有初始化的值,我建议以下之一:

  • POST从数据库代码初始化对象,并仅使用提交的 AmountToPay 值来执行处理。
  • 在视图中为缺失的字段添加隐藏变量,例如 @Html.HiddenFor(model => model.ticket.flight.source.airportCode) .在这种情况下,将提交变量,因此对象将被完全填充。