I'm quite new to ASP.Net MVC and what I'm trying to do is to find a simpler way of adding multiple Orders
to my Delivery
table. At the moment, the only way I can add Orders
to my Delivery
table is through my Order Edit View
. Which is extremely time-consuming because of the multiple clicking I have to go through.
So after I create my Delivery
, I get directed to my Delivery Detail View
where I can see my Delivery
and the Orders
linked to that Delivery
, but the only way I can add Orders
to the Delivery
is if I go to the Edit Order View
where I link delivery_id
to the Order
there.
What I did for now was that I added a button on my Delivery Details View
that takes me to the Order Index View
with all my Orders
, and I then set the delivery_id
by clicking on Edit Order
for each individual Order
I want part of that Delivery
, and then doing the linkage in there. This is basically done one by one.
I want to be able to add multiple Orders
to specific Delivery
without having to go through that process.
If anyone can suggest a simpler solution for this, I'll Greatly appreciate it!
Delivery Controller:
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);
}
}
}
Delivery Model:
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; }
}
}
Delivery Details View:
@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>
Order Controller:
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);
}
}
}
Order Model:
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; }
}
}