当我使用现有交付中的复选框取消选择订单时,不保存我所做的更改

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 Deliveryadd 更多基于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);