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

ASP.NET Core 8 MVC表单POST时无法获取URL中的QueryString怎么办?

解决ASP.NET Core MVC POST动作获取URL QueryString的问题

问题根源

你遇到的核心问题是:当通过GET请求访问带ReturnUrl参数的登录页面时,页面中的<form>标签仅指定了asp-action="SignIn",生成的表单action属性是/Account/SignIn,并未携带原URL中的ReturnUrl参数。因此提交POST请求时,目标URL没有QueryString,自然无法通过Request.Query或参数获取到该值。

解决方案

下面提供三种实用的解决方式,任选其一即可:

方法1:通过表单隐藏字段传递参数

在表单内添加一个隐藏输入框,将当前页面的ReturnUrl值存入其中,POST时作为表单数据提交:

@model Db.Models.Setting

@{
  ViewData["Title"] = "Sign In";
}

<h1>Sign In</h1>
<h4>Enter the site PIN</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="SignIn">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <!-- 添加隐藏字段传递ReturnUrl -->
      <input type="hidden" name="ReturnUrl" value="@Context.Request.Query["ReturnUrl"]" />

      <div class="form-group col-5">
        <label asp-for="AuthPin" class="control-label"></label>
        <input id="authPin" asp-for="AuthPin" class="form-control" />
        <span asp-validation-for="AuthPin" class="text-danger"></span>
      </div>

      <div class="form-group">
        <input id="signInButton" type="submit" class="btn btn-primary" value="Sign In" disabled />
      </div>
    </form>
  </div>
</div>

然后直接在控制器POST方法中添加参数接收:

Public Class AccountController
  <HttpPost>
  Public Async Function SignInAsync(Setting As Setting, ReturnUrl As String) As Task(Of IActionResult)
    ' 直接使用ReturnUrl参数即可
    ' etc.
  End Function
End Class

方法2:修改表单Action携带QueryString

利用asp-route-*标签助手,将ReturnUrl直接拼接到表单的action属性中,确保POST请求的URL包含该参数:

<!-- 修改form标签,添加asp-route-ReturnUrl -->
<form asp-action="SignIn" asp-route-ReturnUrl="@Context.Request.Query["ReturnUrl"]">
  <!-- 其余表单内容不变 -->
</form>

此时生成的表单action会是/Account/SignIn?ReturnUrl=/Contacts,POST时URL会携带该参数,控制器可通过Request.Query("ReturnUrl")或直接添加参数获取。

方法3:在GET方法中暂存参数到ViewData

如果你的SignIn页面有对应的GET动作方法,可以先将ReturnUrl存入ViewData,再在视图中读取:

Public Class AccountController
  <HttpGet>
  Public Function SignIn() As IActionResult
    ' 将QueryString中的ReturnUrl存入ViewData
    ViewData("ReturnUrl") = Request.Query("ReturnUrl")
    Return View(New Setting())
  End Function

  <HttpPost>
  Public Async Function SignInAsync(Setting As Setting, ReturnUrl As String) As Task(Of IActionResult)
    ' 使用ReturnUrl参数
    ' etc.
  End Function
End Class

视图中隐藏字段改为读取ViewData:

<input type="hidden" name="ReturnUrl" value="@ViewData["ReturnUrl"]" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:35