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
相关产品推荐
相关产品推荐

