I'm having difficulty in saving changes I make to a existing Delivery on the Edit Delivery page when I try to deselect Orders that have already been linked.
I want to be able to remove those Orders I've already added when I initially Created the Delivery and add more based on the Orders available today.
Currently, it doesn't save when I deselect the Orders that I have previously added through the Create method, so those Orders are still linked to the Delivery. However, it does allow me to add more Orders so that's alright.
So, essentially, the problem lies in the POST method of Edit.
Can anyone please advise me on a fix or a way forward? Thank you in advance.
View Models:
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; }
}
Models:
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; }
}
Edit Method in Controller:
[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 });
}
// GET: Delivery/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Delivery delivery = db.Deliverys.Find(id);
// Get all available orders (see note below)
var orders = db.Orders.Where(o => o.Expected_Date == DateTime.Today).Select(o => new OrderVM()
{
ID = o.OrderID,
Name = o.Hospital.Name,
}).ToList();
// Mark selected orders based on data model
IEnumerable<int> selectedOrders = delivery.Orders.Select(o => o.OrderID);
foreach (var order in orders)
{
if (selectedOrders.Contains(order.ID))
{
order.IsSelected = true;
}
}
// Initialize the view model
DeliveryVM model = new DeliveryVM()
{
ID = delivery.DeliveryID,
...
Orders = orders,
};
return View(model);
Aucun commentaire:
Enregistrer un commentaire