2014-09-30 84 views
0

我正在嘗試創建發票。我有兩個型號,Invoice & InvoiceItems使用型號列表創建記錄

我可以使用硬編碼值插入,但我希望能夠使用TextBoxes即時創建發票。如何使用相同的視圖插入一條記錄,該記錄將發票項目的數據和發票項目中的動態數據插入到兩個表格中?我希望最終可以在處添加更多按鈕,以便我可以保持在同一頁面上並不斷向同一張發票添加項目。你可以看到我在下面的嘗試。

發票型號:

public class Invoice 
{ 
    [Key] 
    public int InvoiceId { get; set; } 
    public int ClientId { get; set; } 
    [Display(Name = "Amount")] 
    public decimal Amount { get; set; } 
    [Display(Name = "Invoice Creation Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 
    public DateTime CreationDate { get; set; } 
    [Display(Name = "Invoice Due Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 
    public DateTime DueDate { get; set; } 
    [Display(Name = "Notes")] 
    public string InvoiceNotes { get; set; } 

    public List<InvoiceDetails> InvoiceDetails { get; set; } 
    public List<Clients> Clients { get; set; } 
} 

InvoiceItem型號:

public class InvoiceDetails 
{ 
    [Key] 
    public int InvoiceDetailsId { get; set; } 
    public int InvoiceId { get; set; } 
    [DisplayName("Item Name")] 
    public string Name { get; set; } 
    [DisplayName("Item Note")] 
    public string Note { get; set; } 
    [DisplayName("Qty")] 
    public decimal? Quantity { get; set; } 
    [DisplayName("Rate/Hour")] 
    public decimal? Price { get; set; } 
    [DisplayName("Item Total")] 
    public decimal? Total { get; set; } 
} 

發票控制器:

private NovaDb _db = new NovaDb(); 
public ActionResult InvoiceInformation() 
    { 
     var invoice = new Invoice(); 

     invoice.InvoiceDetails = new List<InvoiceDetails>(); 

     return View(invoice); 
    } 

    [HttpPost] 
    public ActionResult InvoiceInformation(Invoice model) 
    { 
     if (ModelState.IsValid) 
     { 
      var invoices = new Invoice() 
      { 
       Amount = model.Amount, 
       CreationDate = model.CreationDate, 
       DueDate = model.DueDate, 
       InvoiceNotes = model.InvoiceNotes, 
       InvoiceId = model.InvoiceId, 
       ClientId = model.ClientId      
      }; 

      _db.Invoices.Add(invoices); 
      _db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 

發票查看:

@model NovaFinancial.Models.Invoice 

@{ 
ViewBag.Title = "InvoiceInformation"; 
} 

<h2>InvoiceInformation</h2> 

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Invoice</legend> 

    @Html.HiddenFor(model => model.InvoiceId) 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ClientId) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ClientId) 
     @Html.ValidationMessageFor(model => model.ClientId) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Amount) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Amount) 
     @Html.ValidationMessageFor(model => model.Amount) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.CreationDate) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.CreationDate) 
     @Html.ValidationMessageFor(model => model.CreationDate) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.DueDate) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.DueDate) 
     @Html.ValidationMessageFor(model => model.DueDate) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.InvoiceNotes) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.InvoiceNotes) 
     @Html.ValidationMessageFor(model => model.InvoiceNotes) 
    </div> 

    <div> 
     <table> 
      <tr> 
       <th>Name</th> 
       <th>Notes</th> 
       <th>Qty</th> 
       <th>Price</th> 
       <th>Total</th> 
      </tr> 
      @for (int i = 0; i < Model.InvoiceDetails.Count; i++) 
      { 
       @Html.HiddenFor(m=>m.InvoiceDetails[i].Name)  
       @Html.HiddenFor(m=>m.InvoiceDetails[i].Note) 
       @Html.HiddenFor(m=>m.InvoiceDetails[i].Quantity) 
       @Html.HiddenFor(m=>m.InvoiceDetails[i].Price) 
       @Html.HiddenFor(m=>m.InvoiceDetails[i].Total) 
       <tr> 
        <td>@Html.DisplayFor(m=>m.InvoiceDetails[i].Name) | @Html.TextBoxFor(m=>m.InvoiceDetails[i].Name)</td> 
        <td>@Html.DisplayFor(m=>m.InvoiceDetails[i].Note) | @Html.TextBoxFor(m=>m.InvoiceDetails[i].Note)</td> 
        <td>@Html.DisplayFor(m=>m.InvoiceDetails[i].Quantity) | @Html.TextBoxFor(m=>m.InvoiceDetails[i].Quantity)</td> 
        <td>@Html.DisplayFor(m=>m.InvoiceDetails[i].Price) | @Html.TextBoxFor(m=>m.InvoiceDetails[i].Price)</td> 
        <td>@Html.DisplayFor(m=>m.InvoiceDetails[i].Total) | @Html.TextBoxFor(m=>m.InvoiceDetails[i].Total)</td> 
       </tr> 
      }     
     </table> 
    </div> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
} 
+0

那麼,你的問題是什麼? – Tobias 2014-09-30 19:03:45

+0

只是想檢查你的問題是否取得了進展。它對我感興趣,所以今天我花了一點時間來研究它。我可以用一件物品創建發票,但仍然試圖弄清楚如何讓多件物品通過。我知道使用相同名稱的傳遞表單輸入會給出一個數組,我覺得它可能包含密鑰。 – 2014-10-02 20:21:08

回答

0

我摸索出「一」的解決方案,可能不是最好的,但它的工作原理。您仍然必須添加代碼才能使其更加健壯,但總體框架就在那裏。

在您的視圖中,將所有發票明細(名稱,數量,價格)的文本框保留爲name屬性的相同值,但請確保id的唯一性。我使用了一些jQuery和JavaScript來根據用戶需要點擊的按鈕生成額外的行。例如,

<input type="text" name="Name" id="Name"> <!--first line item for Item Name--> 
<input type="number" name="Quantity" id="Quantity"> <!--first for Quanitity --> 

<input type="text" name="Name" id="Name2"> <!--second line item for Item Name--> 
<input type="number" name="Quantity" id="Quantity2"> <!-- second for Quanitity --> 

爲InvoiceDetail線的值將傳回服務器爲以逗號分隔字符串(最好做某些您的項目名稱沒有逗號!)。在服務器端,

var Names = Request["Name"]; // this would yield something like "Labor,Parts" 

在控制器中,你需要解析字符串成陣列,並從他們創造的InvoiceDetail的實例。我寫了一個私有方法來分割字符串,並將InvoiceDetail對象列表返回給操作方法。您有責任驗證這些數據:客戶端和服務器端都需要驗證。

我做了一些實驗。你可以在這裏看到所有的代碼:http://mefixme.blogspot.com/2014/10/aspnet-mvc-how-to-add-model-with.html

我希望這可以幫助你。