[英]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
操作方法中 -
token
的字符串參數,以便 model binder 可以從 url 中收集到 token 字符串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.