根据 Delivery 对象的 ID 保存选定的订单

Saving selected orders based on the ID of the Delivery object

我有一个 Delivery Create View,其中我 select Orders 添加到那个 Delivery。但是,它似乎并不想将 linkage 保存在数据库中。 Delivery 被创建是因为如果我返回程序我可以在那里看到它,但问题在于将 Orders 到 link 放到 Delivery 上。

当我输入所有交付详细信息并且我想要的订单已经 selected 后,当我点击保存时,它总是把我踢出去。

当我尝试保存 order.DeliveryID = delivery.DeliveryID; 并且错误消息是 "An exception of type 'System.NullReferenceException' occurred in HealthHabitat.dll but was not handled in user code" 时,问题似乎出在这一行上。我已经用谷歌搜索了一下,但我不确定如何根据我的情况解决它。

请记住,我是 Asp.Net MVC 的新手,因此非常感谢您的帮助!

这是我目前拥有的:

创建POST方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DeliveryVM model)
{
    Delivery delivery = new Delivery()
    {
    DriverID = model.DriverID,
    Dispatched_Date = DateTime.Now, 
    Dispatched_Time = DateTime.Now

    };
      db.Deliverys.Add(delivery);
      db.SaveChanges();
      // save the selected orders based on the ID of the Delivery object
      IEnumerable<int> selectedOrders = model.Orders.Where(o => o.IsSelected).Select(o => o.ID);
      foreach (int ID in selectedOrders)
      {
        Order order = db.Orders.Where(o => o.OrderID == ID).FirstOrDefault();
        order.DeliveryID = delivery.DeliveryID;
        db.Entry(order).State = EntityState.Modified;
      }
      db.SaveChanges();
      return RedirectToAction("Details", new { id = delivery.DeliveryID })

;

创建视图:

@for (int i = 0; i < Model.Orders.Count; i++)
  {
    <tr>
    <td style="width:auto">
    @Html.DisplayFor(m => m.Orders[i].ID)
    </td>
    <td style="width:auto">
    @Html.LabelFor(m => m.Orders[i].IsSelected,    Model.Orders[i].Name,htmlAttributes: new { @class = "control-label col-md-2" })
    </td>
    <td style="width:auto">
     @Html.CheckBoxFor(m => m.Orders[i].IsSelected, new { htmlAttributes = new { @class = "form-control" } })
    </td>
    </tr>
 }

确保您的 'order' 变量在分配给 'order.DeliveryID' 之前不为空。

原来我的 View 中的这一行是问题所在。

@Html.DisplayFor(m => m.Orders[i].ID)

我想是因为 DisplayFor 属性导致表单无法拉取 OrderID

所以我改成了:

@Html.HiddenFor(m => m.Orders[i].ID)

现在可以了。但是,现在我无法显示 OrderID。因此,作为回应,我只是在上面的代码下面添加了相同的代码行,并将属性从 HiddenFor 更改为 DisplayFor 现在它检索 OrderID 并显示 OrderID 这样我就知道我要选择哪一个了。

@Html.HiddenFor(m => m.Orders[i].ID)
@Html.DisplayFor(m => m.Orders[i].ID)

这行得通,但如果有人不同意这种方式并且有更好的选择,请随时进行相应的编辑