如何将新创建的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; }
    }
}

如何将新创建的ID从订单控制器传递到MVC中的订单项控制器

有点不清楚OrderItemControllerIndex()方法的目的是什么。您只是显示所有订单的所有订单项。通常,OrderControllerDetails()方法将显示订单的详细信息和与该订单相关的项目列表(可能作为一个表显示每个OrderItem的所有详细信息,包括编辑/删除链接,或者作为OrderItemControllerDetails()方法的链接,如果在一个页面上显示的信息太多)

我建议使用以下结构

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 });
}

OrderDetailsCreate.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());
}