根据 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)
这行得通,但如果有人不同意这种方式并且有更好的选择,请随时进行相应的编辑
我有一个 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)
这行得通,但如果有人不同意这种方式并且有更好的选择,请随时进行相应的编辑