如何将新创建的ID从订单控制器传递到MVC中的订单项控制器
本文关键字:控制器 单项 MVC ID 新创建 创建 | 更新日期: 2023-09-27 18:09:05
我想做的是将新创建的OrderID
从我的Order Controller
创建表单传递到OrderItem Controller
创建表单,并添加与我刚刚传递的特定OrderID
相关的Order_Items。我设法将创建订单按钮重定向到OrderItem索引表单,但当我想添加新的OrderItems
时,它仍然拉出所有以前创建的OrderIDs
,包括新的OrderID
。我希望表单只拉我刚刚创建的OrderID
,而不是以前创建的所有其他OrderIDs
。
此外,我将其重定向到订单项索引表单的原因是,这样我就可以看到与特定OrderID
相关的所有订单项,但它仍然显示为每个OrderID
创建的所有OrderItems
。
我不知道如何做到这一点,因为我是相当新的MVC,所以所有的帮助是非常感激。
这是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
{
{
private HealthContext db = new HealthContext();
// GET: Order
public ActionResult Index()
{
var orders = db.Orders.Include(o => o.Delivery).Include(o => o.Hospital).Include(o => o.Staff);
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.Find(id);
if (order == null)
{
return HttpNotFound();
}
return View(order);
}
// GET: Order/Create
public ActionResult Create()
{
ViewBag.HospitalID = new SelectList(db.Hospitals, "HospitalID", "Name");
ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "First_Name");
return View();
}
// 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("Index","OrderItem", new { id = "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("Index");
}
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_Item控制器的代码:
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 OrderItemController : Controller
{
private HealthContext db = new HealthContext();
// GET: OrderItem
public ActionResult Index()
{
var order_Items = db.Order_Items.Include(o => o.Item).Include(o => o.Order);
return View(order_Items.ToList());
}
// GET: OrderItem/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Order_Item order_Item = db.Order_Items.Find(id);
if (order_Item == null)
{
return HttpNotFound();
}
return View(order_Item);
}
// GET: OrderItem/Create
public ActionResult Create()
{
ViewBag.ItemID = new SelectList(db.Items, "ItemID", "Name");
ViewBag.OrderID = new SelectList(db.Orders, "OrderID", "OrderID");
return View();
}
// POST: OrderItem/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 = "Order_ItemID,OrderID,ItemID,Type,Quantity")] Order_Item order_Item)
{
if (ModelState.IsValid)
{
db.Order_Items.Add(order_Item);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ItemID = new SelectList(db.Items, "ItemID", "Name", order_Item.ItemID);
ViewBag.OrderID = new SelectList(db.Orders, "OrderID", "OrderID", order_Item.OrderID);
return View(order_Item);
}
// GET: OrderItem/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Order_Item order_Item = db.Order_Items.Find(id);
if (order_Item == null)
{
return HttpNotFound();
}
ViewBag.ItemID = new SelectList(db.Items, "ItemID", "Name", order_Item.ItemID);
ViewBag.OrderID = new SelectList(db.Orders, "OrderID", "OrderID", order_Item.OrderID);
return View(order_Item);
}
// POST: OrderItem/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 = "Order_ItemID,OrderID,ItemID,Type,Quantity")] Order_Item order_Item)
{
if (ModelState.IsValid)
{
db.Entry(order_Item).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ItemID = new SelectList(db.Items, "ItemID", "Name", order_Item.ItemID);
ViewBag.OrderID = new SelectList(db.Orders, "OrderID", "OrderID", order_Item.OrderID);
return View(order_Item);
}
// GET: OrderItem/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Order_Item order_Item = db.Order_Items.Find(id);
if (order_Item == null)
{
return HttpNotFound();
}
return View(order_Item);
}
// POST: OrderItem/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Order_Item order_Item = db.Order_Items.Find(id);
db.Order_Items.Remove(order_Item);
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:H: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; }
}
}
OrderItem模型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 OrderItem
{
public int OrderItemID { get; set; }
public int OrderID { get; set; }
public int ItemID { get; set; }
[Required]
public string Type { get; set; }
public int Quantity { get; set; }
public virtual Order Order { get; set; }
public virtual Item Item { get; set; }
}
}
项目模型
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 Item
{
public int ItemID { get; set; }
[Required, Display(Name = "Item Type")]
public string Type { get; set; }
[Required, Display(Name = "Item Name")]
public string Name { get; set; }
[Display(Name = "Item Quantity")]
public int Quantity { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-mm-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Expiry Date")]
public DateTime Expiry_Date { get; set; }
public int Consumption { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
}
有点不清楚OrderItemController
中Index()
方法的目的是什么。您只是显示所有订单的所有订单项。通常,OrderController
的Details()
方法将显示订单的详细信息和与该订单相关的项目列表(可能作为一个表显示每个OrderItem的所有详细信息,包括编辑/删除链接,或者作为OrderItemController
的Details()
方法的链接,如果在一个页面上显示的信息太多)
我建议使用以下结构
OrderController
public ActionResult Index()
{
// Display a collection on all orders
}
public ActionResult Details(int ID)
{
// Display the details of an order, including a collection of its order items
}
public ActionResult Create()
{
// Create a new Order
}
[HttpPost]
public ActionResult Create(Order model)
{
// Save the order
return RedirectToAction("Details", new { ID = model.ID });
}
Details.cshtml
视图将包含一个链接(菜单项)来创建与Order
相关联的新OrderItem
@Html.ActionLink("Create Item", "Create", "OrderItem", new { ID = Model.OrderID }, null)
OrderItemController
public ActionResult Create(int ID) // ID is the ID of the Order
{
OrderItem model = new OrderItem() { OrderID = ID };
return View(model);
}
[HttpPost]
public ActionResult Create(OrderItem model)
{
// Save the OrderItem and redirect to the order details page
return RedirectToAction("Details", "Order", new { ID = model.OrderID });
}
在OrderDetails
的Create.cshtml
视图中,将OrderID
作为路由值包含在表单中,或者在表单
@model OrderDetail
@using (Html.BeginForm(new { OrderID = Model.OrderID }))
{
....
}
旁注:建议您遵循正常的命名约定- OrderItem
,而不是Order_Item
-并使用视图模型,特别是在创建/编辑和删除那些可怕的[Bind(Include = "...")]
属性时。
为您的OrderItemController
中的Index
动作添加一个id
参数,并使用该id来过滤订单项。
public ActionResult Index(int id)
{
var order_Items = db.Order_Items.Include(o => o.Item).Include(o => o.Order).Where(o => o.OrderId == id);
return View(order_Items.ToList());
}