【发布时间】:2014-09-30 17:47:51
【问题描述】:
我正在尝试创建发票。我有两个模型,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>
}
【问题讨论】:
-
那么,你的问题是什么?
-
只是想检查您是否在问题上取得了任何进展。它让我很感兴趣,所以我今天花了一点时间来研究它。我可以用一个项目创建发票,但仍在试图弄清楚如何让多个项目通过。我确实知道使用相同名称传递表单输入会给一个数组,我觉得它可能包含密钥。
标签: asp.net-mvc razor asp.net-mvc-viewmodel