如何在ASP.NET MVC 5中插入主 – 详细信息表

我在DB中有Orders表和OrderDetails表。 使用Entity Framework 6,我获得了一个模型,因此我可以从中生成类。 我还从Orders表生成了控制器和视图。

Orders folio (PK) date customer (FK) OrdersDetail folio (FK) -- to the Orders table product (FK) price quantity 

生成的“创建发布”操作如下:

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "folio,date,customer")] Orders order) { if (ModelState.IsValid) { db.Orders.Add(order); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.cliente = new SelectList(db.CATCTES, "COD_CTE", "NOM_CTE", order.cliente); return View(order); } 

没关系,但我也需要插入到其他实体/表中! 我已经更改了Create.cshtml表单,其中包含Orders表所需的字段,并包含OrdersDetail的某种网格。 每行都是OrdersDetail表的新条目。

在此处输入图像描述

问题是,我不知道如何在Orders控制器的Create操作中正确保存到其他表。 如果这不是正确的方法,请告诉我你的意见。

另一个问题是关于POSTing,如何命名输入以正确分组并在控制器上使用提交的值? 当我单击表单上的“+”按钮时,每个行都由此脚本生成:

 @section Scripts { @Scripts.Render("~/bundles/jqueryval")  function add_row() { var detalle = $('#detalle'); var newRow = '' + '' + '
' + '' + '' + '
' + '' + '' + '
' + '$' + '' + '
' + '' + '' + '
' + '$' + '' + '
' + '' + '' + ''; detalle.append(newRow); } }

我认为你应该使用Ajax。

在您的视图中,您有网格部分,每次添加记录时都必须使用Ajax post表单将值发布到服务器:

 @using (Ajax.BeginForm("AddDetails", new AjaxOptions { UpdateTargetId = "gridContainerElementId" })) { @Html.HiddenFor(m => m.folio) @Html.HiddenFor(m => m.product) @Html.TextBox(m => m.price) @Html.TextBox(m => m.quantity)  } 

注意:将你的网格放在’gridContainerElementId’div中:

 
@Html.Action("DetailsGridPartial", new { OrderId = Model.folio })

在你的控制器中

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult AddDetails(OrdersDetail orderDetails) { if (ModelState.IsValid) { db.OrdersDetail.Add(orderDetails); db.SaveChanges(); return RedirectToAction("DetailsGridPartial", new { OrderId = orderDetails.folio }); } return View(order); } public ActionResult DetailsGridPartial(int OrderId) { var orderDetails = db.OrdersDetail.Where(w => w.folio == OrderId); return PartialView(orderDetails); } 

您需要创建新视图以显示网格:

 @model IEnumerable @Html.YourHelper.Grid(model).Html() @*or however you build the grid*@ 

在这种情况下,您不需要通过新记录手动填充网格,网格将自动刷新。

我希望这有帮助

在Create Post操作方法中,您需要在使用MVC,Web API,WCF等Web技术时处理断开连接的方法。

订单应包含OrderDetails列表,当其读入操作参数时。 查找是否编辑或添加,并相应地将实体状态更改为已添加或已修改。

这通常会发生,因为在网络应用中EF不处理实体跟踪。 请参阅此链接EF断开的应用程序 。 应用与您的场景类似的场景。