视图模型对象子对象在开机自检时为空
本文关键字:对象 开机自检 模型 视图 | 更新日期: 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.id
和AmountToPay
来构造 PayViewModel 类型的对象。由于它无法从提交的值中找到ticket.flight
中的任何属性,因此它假定它不应该存在,因此为其分配了默认值 null
。这是模型绑定器的预期行为。
如果你想有初始化的值,我建议以下之一:
- 在
POST
从数据库代码初始化对象,并仅使用提交的AmountToPay
值来执行处理。 - 在视图中为缺失的字段添加隐藏变量,例如
@Html.HiddenFor(model => model.ticket.flight.source.airportCode)
.在这种情况下,将提交变量,因此对象将被完全填充。