如何为我的控制器获取 url 参数?
How to get url parameter to my controller?
我正在制作一个功能来重置使用 ASP.NET 身份的用户的密码。但是,令牌未在我的控制器中获取。当我提交表格时,它说
"The Token field is required."
为什么它不接收我的令牌?
以下代码用于生成重置链接:
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);
这会生成 link:http://localhost:50015/adviseur/auth/setpassword?token=someverylongnumbers
这 link 转到以下视图、视图模型和控制器:
AuthController.cs
[HttpGet]
public IActionResult SetPassword()
{
return View();
}
SetPassword.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; }
}
}
表单向以下控制器发出请求:
[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");
}
}
the token is not being picked up in my controller
那是因为你还没有发送。您不会从 url 收集令牌以在下一步中使用它。因此,在 RequestNewPassword
操作方法中,模型绑定器无法在 Token
表单字段中找到值,并且无法创建没有 Token
值的 SetPasswordModel
对象] 属性 因为你把它标记为 Required
。因此抱怨 -
"The Token field is required."
在你的 SetPassword
操作方法中 -
- 在方法中添加一个名为
token
的字符串参数,以便模型绑定器可以从url 中收集令牌字符串
- 通过
ViewBag
或模型将令牌传递给视图。
[HttpGet]
public IActionResult SetPassword(string token)
{
ViewBag.Token = token;
return View();
// OR,
// var model = new SetPasswordModel { Token = token };
// return View(model);
}
如果您通过模型传递令牌,则不需要在视图中进行任何更改。但是,如果您通过 ViewBag
传递它,则将其设置为 Token
表单字段 -
<input type="hidden" asp-for="Token" value="@ViewBag.Token" />
现在,当您提交表单时,在 RequestNewPassword
操作方法中,模型绑定器将能够毫无怨言地为您创建一个 SetPasswordModel
对象。
我正在制作一个功能来重置使用 ASP.NET 身份的用户的密码。但是,令牌未在我的控制器中获取。当我提交表格时,它说
"The Token field is required."
为什么它不接收我的令牌? 以下代码用于生成重置链接:
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);
这会生成 link:http://localhost:50015/adviseur/auth/setpassword?token=someverylongnumbers
这 link 转到以下视图、视图模型和控制器: AuthController.cs
[HttpGet]
public IActionResult SetPassword()
{
return View();
}
SetPassword.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; }
}
}
表单向以下控制器发出请求:
[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");
}
}
the token is not being picked up in my controller
那是因为你还没有发送。您不会从 url 收集令牌以在下一步中使用它。因此,在 RequestNewPassword
操作方法中,模型绑定器无法在 Token
表单字段中找到值,并且无法创建没有 Token
值的 SetPasswordModel
对象] 属性 因为你把它标记为 Required
。因此抱怨 -
"The Token field is required."
在你的 SetPassword
操作方法中 -
- 在方法中添加一个名为
token
的字符串参数,以便模型绑定器可以从url 中收集令牌字符串
- 通过
ViewBag
或模型将令牌传递给视图。
[HttpGet]
public IActionResult SetPassword(string token)
{
ViewBag.Token = token;
return View();
// OR,
// var model = new SetPasswordModel { Token = token };
// return View(model);
}
如果您通过模型传递令牌,则不需要在视图中进行任何更改。但是,如果您通过 ViewBag
传递它,则将其设置为 Token
表单字段 -
<input type="hidden" asp-for="Token" value="@ViewBag.Token" />
现在,当您提交表单时,在 RequestNewPassword
操作方法中,模型绑定器将能够毫无怨言地为您创建一个 SetPasswordModel
对象。