如何在我的编辑传送屏幕上显示所选订单列表和未选择订单列表

时间:2015-09-04 21:35:45

标签: asp.net-mvc

我需要一个解决方案,了解如何在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)

  }
}

1 个答案:

答案 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