You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:35:25