2015-10-17 59 views
2

我有訂單表和OrderDetails DB中的表。使用實體框架6我已經獲得了一個模型,所以我有從它生成的類。我還從訂單表中生成控制器和視圖。如何在ASP.NET MVC中插入主 - 細節表5

Orders 
folio (PK) 
date 
customer (FK) 

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

生成創建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表的新條目。

enter image description here

的問題是我不知道如何正確保存到其他表在訂單控制器創建行動。如果這不是正確的方法,請告訴我你的意見。

另一個值得關注的問題是如何命名輸入以正確分組並在控制器上使用提交的值?由該腳本生成的每一行,當我點擊窗體上的「+」按鈕:

@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> 
} 
+0

參考答案[這裏](http://stackoverflow.com/questions/29161481/post-a-form-array-without-successful/29161796#29161796)和[這裏] (HTTP://計算器。com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) –

回答

0

在你創建後的操作方法,你需要處理斷開連接的方式與網絡技術,如MVC,網絡API時, WCF等。

訂單應包含OrderDetails列表,當它讀入操作參數。查找是否編輯或添加,並相應地將實體狀態更改爲已添加或已修改。

這通常發生是因爲在Web應用程序中EF不處理實體跟蹤。請參考此鏈接EF disconnected apps。應用與您的相似的場景。

3

我認爲你應該使用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*@ 

在這種情況下,你不會需要由新的記錄手動填寫的網格,網格將自動刷新。

我希望這有助於