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

如何在表单提交时将HTML label的值传递到ASP.NET Core PageModel

问题原因

HTML 中<label>元素不属于表单提交控件,浏览器发送表单请求时不会携带<label>的文本内容,所以不管你用模型绑定还是直接读Request.Form都拿不到对应值,这是HTML的原生规则,和Razor绑定逻辑无关。

解决方案

有两种常用实现方式,都可以拿到对应行的日期值:

方案1:新增隐藏表单域+每行独立表单

因为你现在是循环生成多行,每行对应独立的提交按钮,需要把每一行包裹在独立的<form>标签中,避免多行列数据互相干扰,同时新增type="hidden"的隐藏输入框存放日期值:

<tbody>
    @foreach (var item in Model.submissionDates)
    {
        <tr>
            <form method="post">
                <td>
                    <div class="form-group">
                        <label class="control-label">@item.Date</label>
                        <!-- 隐藏域存放日期,会随表单提交 -->
                        <input type="hidden" asp-for="Timesheet.TimesheetStart" value="@item.Date" />
                    </div>
                </td>
                <td>
                    <div class="form-group">
                        <label asp-for="Timesheet.TimesheetNotes" class="control-label">Submission Notes</label>
                        <textarea asp-for="Timesheet.TimesheetNotes" class="form-control" rows="3"></textarea>
                    </div>                                
                </td>
                <td>  
                    <div class="form-group">
                        <input type="submit" value="Submit" class="btn btn-primary" />
                    </div>                                
                </td>
            </form>
        </tr>
    }
</tbody>

改完之后你原来的后端代码不需要做任何修改,就能正常通过Request.Form["Timesheet.TimesheetStart"]或者模型绑定拿到日期值。

方案2:直接通过提交按钮传路由参数

这种方式不需要加隐藏域,直接把日期作为路由参数绑在提交按钮上,后端直接接收参数即可:
前端只需要修改提交按钮的代码:

<input type="submit" value="Submit" class="btn btn-primary" asp-route-timesheetStart="@item.Date" />

后端修改OnPostAsync方法的签名,直接接收参数:

public async Task<IActionResult> OnPostAsync(DateTime timesheetStart)
{ 
    var emptyTimesheet = new Timesheet()
    {
        Submitted = DateTime.Now,
        TimesheetStart = timesheetStart, // 直接用接收的参数
        TimesheetEnd = timesheetStart.AddDays(7),
        ColleagueID = UserColleague,
        BranchID = (int)branchFilter
    };
    // 剩下的原有逻辑不变
}

这种方式代码更简洁,也不需要处理隐藏域的绑定问题。

额外注意

你现在的代码中循环生成的所有textarea都用了同一个id="NotesTextArea",HTML规范要求页面id必须唯一,建议删除这个id属性,或者动态生成唯一id,避免前端JS操作时出现异常。

内容的提问来源于stack exchange,提问作者Colin-G-Davidson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:03