当我使用现有交付中的复选框取消选择订单时,不保存我所做的更改
Not saving the changes I make when I deselect Orders using checkboxes from an existing Delivery
我在 saving changes
中遇到困难 我尝试 deselect
Orders
Edit Delivery
页面上的现有 Delivery
已经链接到 Delivery
.
我希望能够 remove
我最初 Created
时已经添加的那些 Orders
Delivery
和 add
更多基于Orders
今天可用,然后保存。
目前,当我deselect
之前通过Create
方法添加的Orders
时,它不会保存,所以那些Orders
仍然链接到Delivery
。但是,它确实允许我添加更多 Orders
所以没关系。
所以,本质上,问题出在Edit的POST方法上。
任何人都可以就修复或前进的方向向我提出建议吗?先感谢您。
查看模特:
public class DeliveryVM
{
public int? ID { get; set; }
public DateTime Dispatched_Date { get; set; }
public List<OrderVM> Orders { get; set; }
}
public class OrderVM
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime Date { get; set; }
public int DeliveryID { get; set; }
public bool IsSelected { get; set; }
}
型号:
public class Order
{
public int OrderID { get; set; }
public int? DeliveryID { get; set; }
public DateTime Expected_Date { get; set; }
public virtual Delivery Delivery { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class Delivery
{
public int DeliveryID { get; set; }
public DateTime Dispatched_Date { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
在控制器中编辑方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(DeliveryVM model)
{
// Get the data model based on the ID of the view model
Delivery delivery = db.Deliverys.Find(model.ID);
// Map the view model properties to the data model
delivery.DriverID = model.DriverID;
...
// Mark as modified and save
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 });
}
不确定这是唯一的还是最好的方法,但在过去,当我进行选择时,我发现最简单的方法是先取消选择所有内容,然后保存更改,然后添加新的,然后再次保存。
所以像这样:
var oldOrders = deliver.Orders.ToList();
foreach(var o in oldOrders)
{
delivery.Orders.Remove(o);
}
db.SaveChanges();
// now add the new orders
更新:
只是想我要补充一点,您可能在删除时遇到问题的原因是,如果您尝试删除一条记录,然后在保存更改之前添加它,这在过去给我带来了问题。
我还发现使用 ToList before 实现列表避免了尝试更改不断变化的集合时出现的问题。
您当前的代码仅修改在 Edit
视图中选择的订单,并且不必要地更新之前选择的订单。
您需要与原始订单进行比较,并采取相应的措施
// Get the original selected orders
IEnumerable<int> originalOrders = delivery.Orders.Select(o => o.OrderID);
// Get the selected orders from the Edit view
IEnumerable<int> selectedOrders = model.Orders.Where(o => o.IsSelected).Select(o => o.ID);
// Get the orders that have been added
IEnumerable<int> newOrders = selectedOrders.Except(originalOrders);
// Get the orders that have been deleted
IEnumerable<int> deletedOrders = originalOrders.Except(selectedOrders);
foreach (int ID in newOrders)
{
// Get the order, set its DeliveryID property and save (as per your existing code)
}
IEnumerable<Order> toDelete= db.Orders.Where(o => deletedOrders.Contains(o.OrderID));
foreach (Order order in toDelete)
{
order.DeliveryID = null;
db.Entry(order).State = EntityState.Modified;
}
db.SaveChanges();
旁注:没有必要更新没有变化的项目,但如果你想得到它们,那就是
IEnumerable<int> unchangedOrders= originalOrders.Intersect(selectedOrders);
我在 saving changes
中遇到困难 我尝试 deselect
Orders
Edit Delivery
页面上的现有 Delivery
已经链接到 Delivery
.
我希望能够 remove
我最初 Created
时已经添加的那些 Orders
Delivery
和 add
更多基于Orders
今天可用,然后保存。
目前,当我deselect
之前通过Create
方法添加的Orders
时,它不会保存,所以那些Orders
仍然链接到Delivery
。但是,它确实允许我添加更多 Orders
所以没关系。
所以,本质上,问题出在Edit的POST方法上。
任何人都可以就修复或前进的方向向我提出建议吗?先感谢您。
查看模特:
public class DeliveryVM
{
public int? ID { get; set; }
public DateTime Dispatched_Date { get; set; }
public List<OrderVM> Orders { get; set; }
}
public class OrderVM
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime Date { get; set; }
public int DeliveryID { get; set; }
public bool IsSelected { get; set; }
}
型号:
public class Order
{
public int OrderID { get; set; }
public int? DeliveryID { get; set; }
public DateTime Expected_Date { get; set; }
public virtual Delivery Delivery { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class Delivery
{
public int DeliveryID { get; set; }
public DateTime Dispatched_Date { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
在控制器中编辑方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(DeliveryVM model)
{
// Get the data model based on the ID of the view model
Delivery delivery = db.Deliverys.Find(model.ID);
// Map the view model properties to the data model
delivery.DriverID = model.DriverID;
...
// Mark as modified and save
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 });
}
不确定这是唯一的还是最好的方法,但在过去,当我进行选择时,我发现最简单的方法是先取消选择所有内容,然后保存更改,然后添加新的,然后再次保存。
所以像这样:
var oldOrders = deliver.Orders.ToList();
foreach(var o in oldOrders)
{
delivery.Orders.Remove(o);
}
db.SaveChanges();
// now add the new orders
更新: 只是想我要补充一点,您可能在删除时遇到问题的原因是,如果您尝试删除一条记录,然后在保存更改之前添加它,这在过去给我带来了问题。
我还发现使用 ToList before 实现列表避免了尝试更改不断变化的集合时出现的问题。
您当前的代码仅修改在 Edit
视图中选择的订单,并且不必要地更新之前选择的订单。
您需要与原始订单进行比较,并采取相应的措施
// Get the original selected orders
IEnumerable<int> originalOrders = delivery.Orders.Select(o => o.OrderID);
// Get the selected orders from the Edit view
IEnumerable<int> selectedOrders = model.Orders.Where(o => o.IsSelected).Select(o => o.ID);
// Get the orders that have been added
IEnumerable<int> newOrders = selectedOrders.Except(originalOrders);
// Get the orders that have been deleted
IEnumerable<int> deletedOrders = originalOrders.Except(selectedOrders);
foreach (int ID in newOrders)
{
// Get the order, set its DeliveryID property and save (as per your existing code)
}
IEnumerable<Order> toDelete= db.Orders.Where(o => deletedOrders.Contains(o.OrderID));
foreach (Order order in toDelete)
{
order.DeliveryID = null;
db.Entry(order).State = EntityState.Modified;
}
db.SaveChanges();
旁注:没有必要更新没有变化的项目,但如果你想得到它们,那就是
IEnumerable<int> unchangedOrders= originalOrders.Intersect(selectedOrders);