2015-09-04 2 views
1

мне нужно решение о том, как отобразить все Ordersselected меня и все Orders, которая не была selected на мой Edit Delivery Экран для текущего дня. Это так, что я могу deselect a Order, который я выбрал ранее, когда создал Delivery, а затем добавил еще один или не добавил ни одного.Как отобразить список выбранных заказов и список невыбранных Заказы на моем экране редактирования доставки

Так, чтобы дать немного контекста, на мой Create Delivery, отобразить список всех доступных Orders в этот день, а затем выберите Orders Я хочу добавить, и таким образом создать поставку.

Однако, теперь я хочу, чтобы перейти к моему Edit Delivery экрану, чтобы внести изменения в этот delivery, которые включают в себя deselecting и, возможно добавление еще Order или удаление Orders, которые были добавлены. Поэтому я не уверен, как решить мои методы GET и POST Edit и мой View для Edit Delivery.

Может ли кто-нибудь посоветовать мне на пути вперед? Было бы точно так же, как Create Delivery? Заранее спасибо.

Просмотр моделей:

public class OrderVM 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
} 
public class DeliveryVM 
{ 
    public int? ID { get; set; } 
    public int DriverID { get; set; } 
    public SelectList DriverList { get; set; } 
    public List<OrderVM> Orders { get; set; } 
} 

Контроллер Edit Method:

public ActionResult Edit(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Delivery delivery = db.Deliverys.Find(id); 
    if (delivery == null) 
    { 
     return HttpNotFound(); 
    } 
    ViewBag.DriverID = new SelectList(db.Drivers, "DriverID", "First_Name", delivery.DriverID); 
    return View(delivery); 
} 

// POST: Delivery/Edit/5 
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "DeliveryID,DriverID,Status,Comment,Dispatched_Date,Dispatched_Time,Delivered_Date,Delivered_Time,Delayed_Date,Delayed_Time")] Delivery delivery) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(delivery).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Details", new { id = delivery.DeliveryID }); 
    } 
    ViewBag.DriverID = new SelectList(db.Drivers, "DriverID", "First_Name", delivery.DriverID); 
    return View(delivery); 
} 

контроллер Создать метод:

public ActionResult Create() 
{ 
    DeliveryVM model = new DeliveryVM() 
    { 
    DriverList = new SelectList(db.Drivers, "DriverID", "First_Name"), 
    Orders = db.Orders.Where(o => o.Expected_Date == DateTime.Today).Select(o => new OrderVM() 
    { 
     ID = o.OrderID, 
     Name = o.Hospital.Name, 
    }).ToList() 
    }; 
    return View(model); 
} 
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.State = EntityState.Modified 
    } 
    db.SaveChanges(); 
} 

Как Создать View выглядит:

@model DeliveryVM 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.DriverID, Model.DriverList, "-Please select-") 
    .... 
    for(int i = 0; i < Model.Orders.Count; i++) 
    { 
    @Html.HiddenForFor(m => m.Orders[i].ID) 
    @Html.CheckBoxFor(m => m.Orders[i].IsSelected) 
    @Html.LabelFor(m => m.Orders[i].IsSelected, Model.Orders[i].Name) 

    } 
} 

ответ

1

Ваш метод Edit() просто должен получить все доступные заказы в дополнение к вашей модели данных Delivery, а затем заполнить модель с учетом всех заказов и установить свойство IsSelected на основе выбранных в настоящее время ордеров. У вас уже есть модель представления, поэтому не используйте модель данных. Вы не показал вам, модели данных, но я предполагаю, что Delivery содержит свойство ICollection<Order> Orders

public ActionResult Edit(int? id) 
{ 
    .... 
    // Get your data model 
    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 
    // Because you have not shown your data models, the following is a best guess 
    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, 
    DriverID = delivery.DriverID, 
    Orders = orders, 
    DriverList = new SelectList(db.Drivers, "DriverID", "First_Name") 
    } 
    return View(model); 
} 

Side Примечание: Использование .Where(o => o.Expected_Date == DateTime.Today) вероятно, не будет правильным, если ваш не редактируя Delivery в тот же день, когда вы его создали. Ваша модель данных должна включать в себя свойство DateTime, чтобы вы могли выбрать соответствующие заказы. Например, это может быть что-то вроде .Where(o => o.Expected_Date == delivery.DeliveryDate)

Вы Edit зрения будет таким же, как ваш Create и теперь будет показывать все заказы, и те, которые были выбраны предыдущим будут проверены в представлении.

Наконец, измените метод POST для

HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(DeliveryVM model) 
{ 
    // similar to your Create() method, except that you are saving an existing 
    // Delivery rather than adding one (and you may not need to save it unless 
    // the Driver has changed) and updating the collection of Orders based on 
    // the IsSelected property 
} 
+0

Привет, спасибо еще раз Стивен. Я разместил еще один вопрос относительно Order Items здесь http://stackoverflow.com/questions/32405011/dbupdateconcurrencyexception-when-editing-data-that-already-exists-even-though-i?noredirect1_comment52682777_32405011 - его dbupdateconcurrencyexception ошибка? Я не знаю, есть ли у вас какой-нибудь опыт, но, может быть, вы можете видеть, что я делаю неправильно? – mustang00

+0

Вы отметили в комментарии к вопросу о том, что таблица содержит поле для версии, которое означает, что вам нужно включать и вводить для этого в вашей форме, но правильный подход - использовать модель представления, а затем получить модель данных из базы данных в метод POST и модель данных обновления, основанные на свойствах модели представления (в противном случае вы открываете себя для переадресации атак злоумышленников) –

+0

Привет, Стивен, ваш метод работает отлично. Есть только одна проблема, каждый раз, когда я пытаюсь сохранить после редактирования значения при доставке, я получаю ошибку DbUpdateException. Любая идея почему? – mustang00

Смежные вопросы