注意:答案可能是 VB.NET 或 C#。我对这个问答没有偏好。
我按照这个示例构建一个使用 cookie 身份验证的简单 ASP.NET Core 8 MVC 应用程序。我遇到了 URL 上的查询字符串未发送到控制器的问题。
Request.QueryString
的值为空字符串。
这是我的网址:
https://localhost:55387/Account/SignIn?ReturnUrl=%2FContacts
这是我的控制器:
Public Class AccountController
<HttpPost>
Public Async Function SignInAsync(Setting As Setting) As Task(Of IActionResult)
Dim ReturnUrl As String = Me.Request.Query("ReturnUrl")
' etc.
End Function
End Class
...这是我的观点:
@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>
<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>
问题在于该示例适用于 Razor Pages 应用程序。我的是MVC。在示例中,这工作得很好:
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
this.ReturnUrl = returnUrl;
}
此处,
returnURL
变量已按预期填充。但在 MVC 中,我们没有 OnPostAsync
函数。我正在处理控制器操作中的所有内容。由于某种原因,该操作没有拾取查询字符串。
有 this 答案,但就我而言,
Url
实例上没有 Request
属性。有一个 Path
属性,但其值不包含查询字符串 ("/Account/SignIn")。
还有 this 答案,但是在
ReturnUrl
后操作上添加 SignIn
参数没有帮助。
如何让我的控制器/操作收集表单上的查询字符串
POST
?
我能够使用这种技术解决这个问题。这不是最漂亮的解决方案,但至少有效。
视图中:
@Html.Hidden("QueryString", @Context.Request.QueryString)
...然后在控制器中:
<HttpPost>
Public Async Function SignInAsync(QueryString As String) As Task(Of IActionResult)
Dim oQueryString As NameValueCollection
Dim oDictionary As RouteValueDictionary
Dim sReturnUrl As String
Dim oResult As IActionResult
oQueryString = HttpUtility.ParseQueryString(QueryString)
oDictionary = New RouteValueDictionary
sReturnUrl = oQueryString("ReturnUrl")
Array.ForEach(oQueryString.AllKeys, Sub(Key) oDictionary.Add(Key, oQueryString(Key)))
oResult = Me.RedirectToAction("SignIn", oDictionary)
' etc.
End Function
这就成功了。