我是ASP.Net MVC的新手,而我正在尝试的是找到一种向Orders
表添加多个Delivery
的简单方法。目前,我可以添加 Orders
到Delivery
表的唯一方法是通过我的Order Edit View
。这是非常耗时的,因为我必须经历多次点击。
因此,在创建Delivery
之后,我会定向到我的Delivery Detail View
,在那里我可以看到我的Delivery
和Orders
与Delivery
相关联,但我可以将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; }
}
}
答案 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]
属性打开了自己的优势 - 您包含了所有属性,因此恶意用户可以轻松发布导致您的应用失败的无效日期。使用视图模型意味着您永远不需要使用属性