ASP.NET Core 8 MVC 表单发布期间 QueryString 为空

问题描述 投票:0回答:1

注意:答案可能是 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

asp.net-core-mvc query-string asp.net-core-8
1个回答
0
投票

我能够使用这种技术解决这个问题。这不是最漂亮的解决方案,但至少有效。

视图中:

@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

这就成功了。

© www.soinside.com 2019 - 2024. All rights reserved.