![](/img/trans.png)
[英]Master-Detail Create Views with Razor, ASP.NET MVC 3 and .NET 4.0
[英]How to Insert to Master-detail tables in 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")
<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>
}
我认为你应该使用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)
<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*@
在这种情况下,您不需要通过新记录手动填充网格,网格将自动刷新。
我希望这有帮助
在Create Post操作方法中,您需要在使用MVC,Web API,WCF等Web技术时处理断开连接的方法。
订单应包含OrderDetails列表,当其读入操作参数时。 查找是否编辑或添加,并相应地将实体状态更改为已添加或已修改。
这通常是因为在Web应用程序中EF不处理实体跟踪。 请参阅此链接EF断开的应用程序 。 应用与您的场景类似的场景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.