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

时间:2015-08-31 17:43:09

标签: asp.net nullreferenceexception

我有Delivery Create View,其中我选择Orders添加到Delivery。但是,它似乎不想在数据库中保存链接Delivery被创建是因为我可以在那里看到它,如果我回到程序中,但问题在于让Orders链接到Delivery

在我输入所有交货细节并选择了我想要的订单后,点击保存后,它一直在踢我。

当我尝试保存order.DeliveryID = delivery.DeliveryID;并且错误消息是“HealthHabitat.dll中发生了类型'System.NullReferenceException的异常但未在用户代码中处理”时,问题似乎在于此行。我已经在谷歌上搜索了一下,但我不知道如何解决这个问题。

请记住,我是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>
 }

2 个答案:

答案 0 :(得分:0)

确保您的订单&#39;在分配给&#39; order.DeliveryID&#39;。

之前,变量不为null

答案 1 :(得分:0)

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

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

我认为这是因为由于OrderID属性,表单无法提取DisplayFor

所以我把它改成了:

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

现在它有效。但是,现在我无法显示OrderID。因此,我只是在上面的代码下面添加了相同的代码行,并将属性从HiddenFor更改为DisplayFor,现在它检索OrderID并显示{{1所以我知道我正在选择哪一个。

OrderID

这有效,但如果有人不同意这种方式并有更好的选择,请随意编辑相应的