我需要一个解决方案,了解如何在Orders
selected
上显示Orders
selected
以及Edit Delivery
以外的所有deselect
当天的屏幕。这样我可以Order
Delivery
我之前在创建Create Delivery
时选择,然后添加另一个或添加无。
为了给出一些上下文,我在Orders
上显示当天所有可用Orders
的列表,然后选择我要添加的Edit Delivery
,以及从而创造交付。
但是,现在我想转到我的delivery
屏幕,对deselecting
进行更改,其中包括Order
,可能会添加另一个Orders
或删除{{1}已添加的。因此,我不确定如何处理我的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; }
}
控制器编辑方法:
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();
}
创建视图的外观:
@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)
}
}
答案 0 :(得分: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);
}
附注:除非您在创建.Where(o => o.Expected_Date == DateTime.Today)
的同一天编辑Delivery
,否则使用DateTime
可能不正确。您的数据模型需要包含.Where(o => o.Expected_Date == delivery.DeliveryDate)
属性,以便您可以选择适用的订单。例如,它可能类似于Edit
您Create
视图将与您的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
}
相同,现在将显示所有订单,并且视图中将检查之前已选择的订单。
最后,将POST方法更改为
srand