мне нужно решение о том, как отобразить все Orders
selected
меня и все 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)
}
}
Привет, спасибо еще раз Стивен. Я разместил еще один вопрос относительно Order Items здесь http://stackoverflow.com/questions/32405011/dbupdateconcurrencyexception-when-editing-data-that-already-exists-even-though-i?noredirect1_comment52682777_32405011 - его dbupdateconcurrencyexception ошибка? Я не знаю, есть ли у вас какой-нибудь опыт, но, может быть, вы можете видеть, что я делаю неправильно? – mustang00
Вы отметили в комментарии к вопросу о том, что таблица содержит поле для версии, которое означает, что вам нужно включать и вводить для этого в вашей форме, но правильный подход - использовать модель представления, а затем получить модель данных из базы данных в метод POST и модель данных обновления, основанные на свойствах модели представления (в противном случае вы открываете себя для переадресации атак злоумышленников) –
Привет, Стивен, ваш метод работает отлично. Есть только одна проблема, каждый раз, когда я пытаюсь сохранить после редактирования значения при доставке, я получаю ошибку DbUpdateException. Любая идея почему? – mustang00