如何在ASP.NET MVC视图与控制器间传递Invoice对象?
ASP.NET MVC 隐藏字段传递Invoice对象失败的问题解决
问题根源
你当前的实现存在三个核心问题:
- 所有发票项被包裹在同一个表单里,提交时会把循环生成的所有隐藏字段都发送到控制器,模型绑定无法识别要绑定哪一个Invoice对象
- 使用
@Html.TextBoxFor(_=>invoice, new {@type="hidden", @Value=invoice})的方式完全错误,直接将invoice对象赋值给Value属性,最终生成的HTML只是对象的类型字符串(比如YourNamespace.Invoice),根本不是可绑定的对象数据 - 没有为模型绑定提供正确的字段命名结构,ASP.NET MVC的模型绑定需要匹配对象属性名的表单字段
解决方案一:每个发票对应独立表单,传递完整对象字段
修改视图,让每个发票项拥有自己的表单,并为Invoice的每个属性生成对应的隐藏字段:
@model IEnumerable<Invoice> <div class="container"> <div class="row"> @foreach (var invoice in Model) { <div class="col-12 bg-light d-flex justify-content-center align-items-center m-lg-2 mb-lg-5"> <div class="m-lg-2">Číslo faktury : @invoice.InvoiceNumber</div> <div class="m-lg-2">Variabilní symbol : @invoice.VariableSymbol</div> <div class="m-lg-2">Datum vytvoření : @invoice.DateCreated</div> @Html.ActionLink("Stáhnout","Download",invoice,new { @class = "m-lg-2 btn btn-primary"}) <!-- 每个发票单独一个表单 --> @using (Html.BeginForm("ShowModal", "Email", FormMethod.Post)) { <!-- 为Invoice的每个属性生成隐藏字段 --> @Html.HiddenFor(_ => invoice.InvoiceNumber) @Html.HiddenFor(_ => invoice.VariableSymbol) @Html.HiddenFor(_ => invoice.DateCreated) <!-- 其他需要传递的属性也按此方式添加 --> <input type="submit" value="Odeslat" class="m-lg-2 btn btn-secondary showmodal" /> } @Html.ActionLink("Upravit","Edit",invoice,new { @class = "m-lg-2 btn btn-warning"}) @Html.ActionLink("Vymazat","Remove",invoice,new { @class = "m-lg-2 btn btn-danger"}) </div> } </div> </div>
控制器代码无需修改,模型绑定会自动将表单字段映射到Invoice对象。
解决方案二:仅传递Invoice ID,控制器查询完整对象(更推荐)
这种方式更简洁高效,避免传递大量冗余数据:
视图修改:
@model IEnumerable<Invoice> <div class="container"> <div class="row"> @foreach (var invoice in Model) { <div class="col-12 bg-light d-flex justify-content-center align-items-center m-lg-2 mb-lg-5"> <div class="m-lg-2">Číslo faktury : @invoice.InvoiceNumber</div> <div class="m-lg-2">Variabilní symbol : @invoice.VariableSymbol</div> <div class="m-lg-2">Datum vytvoření : @invoice.DateCreated</div> @Html.ActionLink("Stáhnout","Download",invoice,new { @class = "m-lg-2 btn btn-primary"}) @using (Html.BeginForm("ShowModal", "Email", FormMethod.Post)) { <!-- 只传递ID --> @Html.Hidden("InvoiceId", invoice.Id) <input type="submit" value="Odeslat" class="m-lg-2 btn btn-secondary showmodal" /> } @Html.ActionLink("Upravit","Edit",invoice,new { @class = "m-lg-2 btn btn-warning"}) @Html.ActionLink("Vymazat","Remove",invoice,new { @class = "m-lg-2 btn btn-danger"}) </div> } </div> </div>
控制器修改:
// 假设你有数据上下文用于查询 private readonly YourDbContext _context; public YourController(YourDbContext context) { _context = context; } public IActionResult ShowModal(int invoiceId) { // 根据ID从数据库查询完整Invoice对象 var invoice = _context.Invoices.FirstOrDefault(i => i.Id == invoiceId); if (invoice == null) { return NotFound(); } // 传递对象到部分视图 return PartialView("_EmailPopup", invoice); }
内容的提问来源于stack exchange,提问作者jenlee123
相关产品推荐
相关产品推荐

