2010-06-12 84 views
1

我正在使用ASP.NET MVC 2,並且正在努力保存子實體。我有一個現有的發票實體(我在一個單獨的表單上創建),然後我有一個LogHours視圖,我想用它來保存InvoiceLog,這是發票的子實體。這裏的觀點:ASP.NET MVC 2 - 在表單提交上保存子實體

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TothSolutions.Data.Invoice>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Log Hours 
</asp:Content> 

<asp:Content ID="Content3" ContentPlaceHolderID="HeadContent" runat="server"> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $("#InvoiceLogs_0__Description").focus(); 
     }); 
    </script> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<h2>Log Hours</h2> 

<% using (Html.BeginForm("SaveHours", "Invoices")) {%> 
    <%: Html.ValidationSummary(true) %> 
    <fieldset> 
     <legend>Fields</legend> 

     <table> 
      <tr> 
       <th>Date</th> 
       <th>Description</th> 
       <th>Hours</th> 
      </tr> 
      <% 
      int index = 0; 
      foreach (var log in Model.InvoiceLogs) { 
      %> 
       <tr> 
        <td><%: log.LogDate.ToShortDateString() %></td> 
        <td><%: Html.TextBox("InvoiceLogs[" + index + "].Description")%></td> 
        <td><%: Html.TextBox("InvoiceLogs[" + index + "].Hours")%></td> 
        <td>Hours</td> 
       </tr> 
      <% 
       index++; 
      } 
      %> 
     </table> 

     <p> 
      <%: Html.Hidden("InvoiceID") %> 
      <%: Html.Hidden("CreateDate") %> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

</asp:Content> 

而這裏的控制器代碼:

//GET: /Secure/Invoices/LogHours/ 
     public ActionResult LogHours(int id) 
     { 
      var invoice = DataContext.InvoiceData.Get(id); 
      if (invoice == null) 
      { 
       throw new Exception("Invoice not found with id: " + id); 
      } 
      return View(invoice); 
     } 

//POST: /Secure/Invoices/SaveHours/ 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult SaveHours([Bind(Exclude = "InvoiceLogs")]Invoice invoice) 
     { 
      TryUpdateModel(invoice.InvoiceLogs, "InvoiceLogs"); 
      invoice.UpdateDate = DateTime.Now; 
      invoice.DeveloperID = DeveloperID; 
      //attaching existing invoice. 
      DataContext.InvoiceData.Attach(invoice); 
      //save changes. 
      DataContext.SaveChanges(); 
      //redirect to invoice list. 
      return RedirectToAction("Index"); 
     } 

和數據訪問代碼:

public static void Attach(Invoice invoice) 
      { 
       var i = new Invoice { InvoiceID = invoice.InvoiceID }; 
       db.Invoices.Attach(i); 
       db.Invoices.ApplyCurrentValues(invoice); 
      } 

在SaveHours行動,它正確地設置了InvoiceLog的值我調用TryUpdateModel之後的實體,但是當它執行SaveChanges時,它不會使用新值更新數據庫。另外,如果您手動更新數據庫中的InvoiceLog條目的值,然後轉到此頁面,則不會填充文本框,因此顯然不能正確綁定。

感謝, 賈斯汀

回答

0

得到它的工作,我需要填充InvoiceLogID和InvoiceID在隱藏字段,以便他們會在EntityCollection得到填充。