【问题标题】:How to Insert to Master-detail tables in ASP.NET MVC 5如何在 ASP.NET MVC 5 中插入主从表
【发布时间】:2015-10-20 13:14:59
【问题描述】:

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

Orders
folio (PK)
date
customer (FK)

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

生成的 Create Post 动作如下:

[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 操作中正确保存到另一个表。如果这不是正确的方法,请告诉我你的 cmets。 p>

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

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script>
        function add_row() {
            var detalle = $('#detalle');
            var newRow = '<tr>' + 
                            '<td data-title="Product">' +
                              '<div class="input-group">' +
                                '<span class="input-group-addon"></span>' +
                                  '<input class="form-control" type="number" aria-label="Product" name="detail_array[].product" step="0.001" min="0.000" onchange="cambiar_importe(this)" required="true">' +
                              '</div>' +
                            '</td>' +
                            '<td data-title="Price" >' +
                              '<div class="input-group">' +
                                '<span class="input-group-addon">$</span>' +
                                  '<input type="number" class="form-control" aria-label="Price" name="detail_array[].price" onchange="cambiar_importe(this)" step="0.001" min="0.000" required="true">' +
                              '</div>' +
                            '</td>' +
                            '<td data-title="Quantity">' +
                              '<div class="input-group">' +
                                '<span class="input-group-addon">$</span>' +
                                  '<input type="text" class="importe form-control" aria-label="Quantity" name="detail_array[].quantity" step="0.001" min="0.000" readonly="true" >' +
                              '</div>' +
                            '</td>' +
                            '<td data-title=""><button type="button" class="btn btn-danger btn-sm" onclick="borrar_renglon(this)">Cancelar</button></td>' +
                          '</tr>';

            detalle.append(newRow);
        }

    </script>
}

【问题讨论】:

  • 参考答案herehere 了解一些选项

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

我认为你应该使用 Ajax。

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

@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)
  <input type = "submit" value = "Save"/>
}

注意:将您的网格放在“gridContainerElementId”div 中,例如:

<div id="gridContainerElementId">
  @Html.Action("DetailsGridPartial", new { OrderId = Model.folio })
</div>

在你的控制器中

[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<OrdersDetail>
@Html.YourHelper.Grid(model).Html() @*or however you build the grid*@

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

希望对你有帮助

【讨论】:

    【解决方案2】:

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

    Orders 应该包含 OrderDetails 列表,当它读入 action 参数时。查找其是否正在编辑或添加,并将实体状态相应地更改为已添加或已修改。

    这通常是因为在 Web 应用程序中 EF 不处理实体跟踪。请参考此链接EF disconnected apps。应用与您相似的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多