将订单添加到我的交付表的简单方法,而无需转到我的订单编辑页面来执行此操作?

时间:2015-08-29 14:16:29

标签: asp.net asp.net-mvc

我是ASP.Net MVC的新手,而我正在尝试的是找到一种向Orders表添加多个Delivery的简单方法。目前,我可以添加 OrdersDelivery表的唯一方法是通过我的Order Edit View。这是非常耗时的,因为我必须经历多次点击。

因此,在创建Delivery之后,我会定向到我的Delivery Detail View,在那里我可以看到我的DeliveryOrdersDelivery相关联,但我可以将Orders添加到Delivery的唯一方法是,如果我转到Edit Order View我将delivery_id链接到Order的地方。

我现在所做的是,我在Delivery Details View上添加了一个按钮,将我带到Order Index View的所有Orders,然后我设置了delivery_id点击Edit Order为每个Order我希望成为Delivery的一部分,然后在那里进行链接。这基本上是一个接一个地完成的。

我希望能够将多个Orders添加到特定Delivery,而无需经过该过程。

如果有人可以为此提出更简单的解决方案,我将非常感激!

投放控制器:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using HealthHabitat.DAL;
using HealthHabitat.Models;

namespace HealthHabitat.Controllers
{
    public class DeliveryController : Controller
    {
        private HealthContext db = new HealthContext();

        // GET: Delivery
        public ActionResult Index()
        {
            var Deliverys = db.Deliverys.Include(o => o.Driver);
            return View(db.Deliverys.ToList());
        }

        // GET: Delivery/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Delivery delivery = db.Deliverys.Find(id);
            if (delivery == null)
            {
                return HttpNotFound();
            }
            return View(delivery);
        }

        // GET: Delivery/Create
        public ActionResult Create()
        {
            var delivery = new Delivery
            {
                Dispatched_Time = DateTime.Now,
                Dispatched_Date = DateTime.Now,

            };
            ViewBag.DriverID = new SelectList(db.Drivers, "DriverID", "First_Name");
            return View(delivery);
        }

        // POST: Delivery/Create
        // 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 Create([Bind(Include = "DeliveryID,DriverID,Status,Comment,Dispatched_Date,Dispatched_Time,Delivered_Date,Delivered_Time,Delayed_Date,Delayed_Time")] Delivery delivery)
        {
            if (ModelState.IsValid)
            {
                db.Deliverys.Add(delivery);
                db.SaveChanges();
                return RedirectToAction("Details", new { id = delivery.DeliveryID });
            }

            ViewBag.DriverID = new SelectList(db.Drivers, "DriverID", "First_Name", delivery.DriverID);
            return View(delivery);
        }

        // GET: Delivery/Edit/5
        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);
        }

        // GET: Delivery/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Delivery delivery = db.Deliverys.Find(id);
            if (delivery == null)
            {
                return HttpNotFound();
            }
            return View(delivery);
        }

        // POST: Delivery/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Delivery delivery = db.Deliverys.Find(id);
            db.Deliverys.Remove(delivery);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

投放模式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace HealthHabitat.Models
{
    public enum Status
    {
       Dispatched, Delayed, Delivered
    }
    public class Delivery
    {

        public int DeliveryID { get; set; }
        [Display(Name = "Driver")]
        public int DriverID { get; set; }
        public Status Status { get; set; }

        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string Comment { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date Dispatched")]
        public DateTime Dispatched_Date { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
        [Display(Name = "Time Dispatched")]
        public DateTime Dispatched_Time { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date Delivered")]
        public DateTime? Delivered_Date { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
        [Display(Name = "Time Delivered")]
        public DateTime? Delivered_Time { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date Delayed")]
        public DateTime? Delayed_Date { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
        [Display(Name = "Time Delayed")]
        public DateTime? Delayed_Time { get; set; }



        public virtual Driver Driver { get; set; }
        public virtual ICollection<Order> Orders { get; set; }
    }
}

投放详情查看:

@model HealthHabitat.Models.Delivery

@{
    ViewBag.Title = "View Delivery Details";
}



<div>
    <h4>Delivery</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.DriverID)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Driver.Last_Name)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Status)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Status)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Comment)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Comment)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Dispatched_Date)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Dispatched_Date)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Dispatched_Time)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Dispatched_Time)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Delivered_Date)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Delivered_Date)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Delivered_Time)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Delivered_Time)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Delayed_Date)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Delayed_Date)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Delayed_Time)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Delayed_Time)
        </dd>

    </dl>
</div>
<div class="row">
    <div class="col-lg-12">
        <div class="panel panel-default">
            <div class="panel-heading">
                Order Details
            </div>
            <div class="panel-body">
                <div class="table-responsive">
                    <table class="table table-striped">
                        <thead>
                            <tr>
                                <th>Order Number </th>
                                <th>Order Date </th>
                                <th>Order Time</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach (var item in Model.Orders)
                            {
                                <tr>
                                    <td style="width:auto">
                                        @Html.DisplayFor(m => item.OrderID)
                                    </td>
                                    <td style="width:auto">
                                        @Html.DisplayFor(m => item.Date)
                                    </td>
                                    <td style="width:auto">
                                        @Html.DisplayFor(m => item.Time)
                                    </td>
                                    @*<td style="width:auto">
                                        @Html.ActionLink("View Order", "Details", "Order", new { ID = item.DeliveryID }, null)
                                    </td>
                                    <td style="width:auto">
                                        @Html.ActionLink("Remove Order", "Delete", "Order", new { ID = item.DeliveryID }, null)
                                    </td>*@
                                </tr>
                            }
                        </tbody>
                    </table>
                    <p>
                        <a href="@Url.Action("Index", "Order", new { id = Model.DeliveryID }, null)" class="btn btn-success" style="float:right"> Add Orders</a>
                    </p>
                </div>
            </div>
        </div>
    </div>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.DeliveryID }) |
    <a href="~/Delivery/Index" class="btn btn-primary">Back</a>
</p>

订单控制器:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using HealthHabitat.DAL;
using HealthHabitat.Models;

namespace HealthHabitat.Controllers
{
    public class OrderController : Controller
    {
        private HealthContext db = new HealthContext();

        // GET: Order
        public ActionResult Index()
        {
            var orders = db.Orders.Include(o => o.Staff).Include(o => o.Hospital).Include(o => o.Delivery);
            return View(orders.ToList());
        }

        // GET: Order/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Order order = db.Orders.Where(o => o.OrderID == id).Include("OrderItems").FirstOrDefault();
            if (order == null)
            {
                return HttpNotFound();
            }
            return View(order);
        }

        // GET: Order/Create
        public ActionResult Create()
        {
            var order = new Order
            {
                Time = DateTime.Now,
                Date = DateTime.Now,

            };
            ViewBag.HospitalID = new SelectList(db.Hospitals, "HospitalID", "Name");
            ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "First_Name");
            return View(order);
        }

        // POST: Order/Create
        // 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 Create([Bind(Include = "OrderID,HospitalID,StaffID,Date,Time")] Order order)
        {
            if (ModelState.IsValid)
            {
                db.Orders.Add(order);
                db.SaveChanges();

                return RedirectToAction("Details", new { id = order.OrderID });
            }


            ViewBag.HospitalID = new SelectList(db.Hospitals, "HospitalID", "Name", order.HospitalID);
            ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "First_Name", order.StaffID);
            return View(order);
        }

        // GET: Order/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Order order = db.Orders.Find(id);
            if (order == null)
            {
                return HttpNotFound();
            }
            ViewBag.DeliveryID = new SelectList(db.Deliverys, "DeliveryID", "DeliveryID", order.DeliveryID);
            ViewBag.HospitalID = new SelectList(db.Hospitals, "HospitalID", "Name", order.HospitalID);
            ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "First_Name", order.StaffID);
            return View(order);
        }

        // POST: Order/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 = "OrderID,HospitalID,StaffID,DeliveryID,Date,Time")] Order order)
        {
            if (ModelState.IsValid)
            {
                db.Entry(order).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Details", new { id = order.OrderID });
            }
            ViewBag.DeliveryID = new SelectList(db.Deliverys, "DeliveryID", "DeliveryID", order.DeliveryID);
            ViewBag.HospitalID = new SelectList(db.Hospitals, "HospitalID", "Name", order.HospitalID);
            ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "First_Name", order.StaffID);
            return View(order);
        }

        // GET: Order/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Order order = db.Orders.Find(id);
            if (order == null)
            {
                return HttpNotFound();
            }
            return View(order);
        }

        // POST: Order/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Order order = db.Orders.Find(id);
            db.Orders.Remove(order);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

订单型号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace HealthHabitat.Models
{
    public class Order
    {
        public int OrderID { get; set; }

        [Display(Name = "Hospital")]
        public int HospitalID { get; set; }

        [Display(Name = "Staff")]
        public int StaffID { get; set; }
        public int? DeliveryID { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime Date { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
        public DateTime Time { get; set; }

        public virtual Hospital Hospital { get; set; }
        public virtual Staff Staff { get; set; }
        public virtual Delivery Delivery { get; set; }
        public virtual ICollection<OrderItem> OrderItems { get; set; }
    }
}

1 个答案:

答案 0 :(得分:3)

您可以将所有订单的选中列表框添加到创建和编辑交付的视图中。

从表示您想要显示和编辑的视图模型开始

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 Create()
{
  DeliveryVM model = new DeliveryVM()
  {
    DriverList = new SelectList(db.Drivers, "DriverID", "First_Name"),
    Orders = db.Orders.Where(...).Select(o => new OrderVM()
    {
      ID = o.OrderID,
      Name = // build the display string you want based on other properties
    }).ToList()
  };
  return View(model);
}
public ActionResult Create(DeliveryVM model)
{
  Delivery delivery = new Delivery()
  {
    DriverID = model.DriverID,
    // map other properties of the view model to the data model
    Dispatched_Date = DateTime.Now, // set here, NOT in the GET method
    ....
  }
  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.Orders(order).State = EntityState.Modified
  }
  db.SaveChanges();
  // redirect
}

在视图中

@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)
    // include hidden input for the name if you likely to return the view
  }
  <input type="submit" ../>
}

除了将现有对象的值映射到视图模型之外,Edit方法将类似,而在POST方法中,您调用数据库以获取现有对象并从视图模型更新其属性。

附注:您的数据模型似乎包含许多DateTime和属性,这些属性不应该是可编辑的,因此不应包含在视图模型中。不应在保存之前立即在GET方法中设置Dispatched_Date等属性。此外,您通过使用[Bind]属性打开了自己的优势 - 您包含了所有属性,因此恶意用户可以轻松发布导致您的应用失败的无效日期。使用视图模型意味着您永远不需要使用属性