【问题标题】:ViewModel objects child is null on POSTViewModel 对象子项在 POST 上为空
【发布时间】:2015-01-13 13:53:51
【问题描述】:

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

在下面的示例中,为什么 POSTed viewmodel 对象上的 ticket.flight 为 null?

视图模型:

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

【问题讨论】:

  • 能否也添加查看代码?
  • @dotnetom 在 GitHub GIST 中添加了指向视图代码的链接(出于某种原因,StackOverflow 不允许我发布它)。感谢您的回复
  • 删除[Bind(Include = "AmountToPay,ticket,ticket.flight")] 位。当你这样做时会发生什么?

标签: c# asp.net-mvc viewmodel


【解决方案1】:

在表单提交期间,浏览器只提交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)。在这种情况下,变量将被提交,因此对象将被完全填充。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 2015-06-18
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多