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

ASP.NET Core MVC中如何在POST请求中传递查询参数避免丢失

解决POST请求中查询参数丢失的问题

问题原因

表单以POST方式提交时,浏览器只会将表单内的字段放入请求体,不会自动保留原URL中的QueryString参数(比如你的tokenid),所以直接从HttpContext.Request.Query中读取会拿不到值。

解决方案

方案1:在表单中添加隐藏字段

在重置密码的视图表单里,添加一个隐藏字段存储tokenid:

<form asp-action="ResetPassword" method="post">
    @Html.AntiForgeryToken()
    <!-- 隐藏字段传递tokenid -->
    <input type="hidden" name="tokenid" value="@Request.Query["tokenid"]" />
    <!-- 其他用户输入字段 -->
    <button type="submit">提交重置</button>
</form>

后端Action可以直接通过参数接收:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ResetPassword(User user, string tokenid)
{
    var data = _context.PasswordReset3s
                       .Where(d => d.Token == tokenid)
                       .FirstOrDefault();
   
    return View();
}

也可以从请求体中读取:HttpContext.Request.Form["tokenid"]

方案2:在表单Action URL中拼接参数

修改表单的action属性,把tokenid直接拼到请求URL后:

<form asp-action="ResetPassword" asp-route-tokenid="@Request.Query["tokenid"]" method="post">
    @Html.AntiForgeryToken()
    <!-- 其他用户输入字段 -->
    <button type="submit">提交重置</button>
</form>

这样POST请求的URL会带上?tokenid=xxx,你原来的代码就能从HttpContext.Request.Query["tokenid"]中正常读取值。

方案3:用TempData临时存储参数

在进入重置密码页面的GET方法中,将tokenid存入TempData:

[HttpGet]
public IActionResult ResetPassword(string tokenid)
{
    TempData["TokenId"] = tokenid;
    return View();
}

然后在POST方法中取出使用:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ResetPassword(User user)
{
    string tokenid = TempData["TokenId"] as string;
    var data = _context.PasswordReset3s
                       .Where(d => d.Token == tokenid)
                       .FirstOrDefault();
   
    return View();
}

注意:TempData依赖Session,需要确保项目已启用Session功能。

内容的提问来源于stack exchange,提问作者Hitarthi patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:13:20