簡體   English   中英

如何為我的 controller 獲取 url 參數?

[英]How to get url parameter to my controller?

我正在制作 function 以使用 ASP.NET 身份重置用戶的密碼。 但是,我的 controller 中沒有提取令牌。 當我提交表格時,它說

“令牌字段是必需的。”

為什么它不拿起我的令牌? 以下代碼用於生成 resetLink:

    var user = _userManager.FindByNameAsync(email).Result;

    if (user == null || !_userManager.IsEmailConfirmedAsync(user).Result)
    {
        ViewBag.Message = "Error while resetting your password!";
        return View("ResetPassword");
    }

    var token = _userManager.
          GeneratePasswordResetTokenAsync(user).Result;

    var resetLink = Url.Action("SetPassword",
                    "Auth", new { token },
                     protocol: HttpContext.Request.Scheme);

這會生成鏈接: http://localhost:50015/adviseur/auth/setpassword?token=someverylongnumbers

此鏈接轉到以下視圖,viewmodel 和 controller:AuthController.cs

[HttpGet]
public IActionResult SetPassword()
{
    return View();
}

設置密碼.cshtml

@model SetPasswordModel

<h1>Set Your Password</h1>

<form asp-controller="Auth"
      asp-action="RequestNewPassword"
      method="post">

    <input type="hidden" asp-for="Token" />
    <table>
        <tr>
            <td><label asp-for="UserName"></label></td>
            <td><input asp-for="UserName" /></td>
        </tr>
        <tr>
            <td>
                <label asp-for="Password">
                    New Password
                </label>
            </td>
            <td><input asp-for="Password" /></td>
        </tr>
        <tr>
            <td>
                <label asp-for="ConfirmPassword">
                    Confirm New Password
                </label>
            </td>
            <td><input asp-for="ConfirmPassword" /></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit"
                       value="Reset Password" />
            </td>
        </tr>
    </table>

    <div asp-validation-summary="All"></div>

</form>

SetPasswordModel.cs:

#region Using

using System.ComponentModel.DataAnnotations;

#endregion

namespace x.Areas.Adviseur.ViewModels
{
    public class SetPasswordModel
    {
        [Required]
        public string UserName { get; set; }
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
        [Required]
        [DataType(DataType.Password)]
        public string ConfirmPassword { get; set; }
        [Required]
        public string Token { get; set; }
    }
}

該表格向以下 controller 發出請求:

[HttpPost]
public IActionResult RequestNewPassword(SetPasswordModel obj)
{
    User user = _userManager.FindByNameAsync(obj.UserName).Result;
    IdentityResult result = _userManager.ResetPasswordAsync(user, obj.Token, obj.Password).Result;

    if (result.Succeeded)
    {
        ViewBag.Message = "Password reset successful!";
        return View("Login");
    }
    else
    {
        ViewBag.Message = "Error while resetting the password!";
        return View("SetPassword");
    }
}

我的 controller 中沒有收到令牌

那是因為你還沒有發送。 您沒有從 url 收集令牌以在下一步中使用它。 因此,在RequestNewPassword操作方法中,model 綁定程序無法在Token表單字段中找到值,並且它無法創建沒有Token屬性值的SetPasswordModel object,因為您已將其標記為Required 因此抱怨——

“令牌字段是必需的。”

在您的SetPassword操作方法中 -

  1. 在方法中添加一個名為token的字符串參數,以便 model binder 可以從 url 中收集到 token 字符串
  2. 通過ViewBag或 model 將令牌傳遞給視圖。
[HttpGet]
public IActionResult SetPassword(string token)
{
    ViewBag.Token = token;
    return View();

    // OR,
    // var model = new SetPasswordModel { Token = token };
    // return View(model);
}

如果您通過 model 傳遞令牌,則不需要在視圖中進行任何更改。 但是,如果您通過ViewBag傳遞它,則將其設置為Token form-field -

<input type="hidden" asp-for="Token" value="@ViewBag.Token" />

現在,當您提交表單時,在RequestNewPassword操作方法中,model 綁定器將能夠為您創建一個SetPasswordModel object 而不會抱怨。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM