问题描述
我没有 int 或 double 或将任何东西转换为 int 或类似的东西。 我只想重置用户密码。当我想获取用户令牌时,我的 actionmethod 中的一切都很好。但我的观点有误!!!!
我的视图模型:
[display(Name ="email")]
[required(ErrorMessage = "required ... !")]
[EmailAddress(ErrorMessage = "required .")]
[MinLength(10,ErrorMessage = "email invalid")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[display(Name = "new password")]
[required(ErrorMessage = "required ... !")]
[DataType(DataType.Password)]
[MinLength(8,ErrorMessage = "invalid")]
[MaxLength(30,ErrorMessage ="invalid")]
public string Password { get; set; }
[display(Name = "confirmpassword")]
[required(ErrorMessage = "required")]
[DataType(DataType.Password)]
[MinLength(8,ErrorMessage = "invalid")]
[Compare("Password",ErrorMessage ="invalid")]
public string ConfirmPassword { get; set; }
public string Code { get; set; }
这是我的操作方法:
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("Forgetpassword")]
public async Task<IActionResult> ForgetpasswordAsync(Forgetpasswordviewmodel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
{
ModelState.AddModelError(string.Empty,"error ... !");
}
else
{
if(!await _userManager.IsEmailConfirmedAsync(user))
{
ModelState.AddModelError(string.Empty," check your email ");
}
var code = await _userManager.GeneratePasswordResetTokenAsync(user);
var callBackURL = Url.Action("ResetPassword","Account",values: new { code },protocol: Request.Scheme);
await _emailSendr.SendEmailAsync(model.Email,"resetpassword",$"<p style='font-family:tahoma;font-size:14px;font-wight:900;'>click on that<a style='color:highlight;' href='{HtmlEncoder.Default.Encode(callBackURL)}' >click me !</a></p>");
return RedirectToAction("ForgetpasswordConfirmation");
}
}
return View(model);
}
[HttpGet]
public IActionResult ForgetpasswordConfirmation()
{
return View();
}
[HttpGet]
public IActionResult ResetPassword(string code = null)
{
if (code == null)
{
return NotFound();
}
else
{
var model = new ResetPasswordviewmodel { Code = code };
return View(model);
}
}
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("ResetPassword")]
public async Task<IActionResult> ResetPasswordAsync(ResetPasswordviewmodel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
{
ModelState.AddModelError(string.Empty,"not found ");
}
var result = await _userManager.ResetPasswordAsync(user,model.Code,model.Password);
if (result.Succeeded)
{
return RedirectToAction("ResetPasswordConfirmation");
}
else
{
foreach(var item in result.Errors)
{
ModelState.AddModelError(string.Empty,item.Description);
}
}
}
这是我的 html 代码:
@model Platform.Models.viewmodels.ClientSideviewmodels.ResetPasswordviewmodel
@{
Layout = null;
}
<!doctype html>
<html lang="en">
<head>
<Meta charset="utf-8" />
<Meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0" />
<Meta http-equiv="X-UA-Compatible" content="ie-edge" />
<title>somthing</title>
<link rel="stylesheet" href="~/css/styles.css" />
<link href="~/vendor/font-awesome/css/fontawesome-all.min.css" rel="stylesheet" />
<script src="~/lib/jquery/dist/jquery.min.js"></script>
</head>
<body>
<div class="page-wrapper flex-row align-items-center">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-5">
<div class="card p-4">
<div class="card-header text-center text-uppercase h4 font-weight-light">
reset password
</div>
<hr />
<form asp-action="ResetPassword" method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<input asp-for="Code" type="hidden" />
<div class="card-body py-2">
<div class="form-group">
<label class="form-control-label" asp-for="Email"></label>
<input type="email" class="form-control" asp-for="Email" placeholder="email" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label class="form-control-label" asp-for="Password"></label>
<input type="password" class="form-control" asp-for="Password" placeholder="enter password" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group">
<label class="form-control-label" asp-for="ConfirmPassword"></label>
<input type="password" class="form-control" asp-for="ConfirmPassword" placeholder="password again" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
</div>
<div class="card-footer">
<button type="submit" class="btn btn-warning btn-block">change password</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
</body>
</html>
我不知道为什么会这样,我真的找不到任何原因
解决方法
我认为您需要像这样更改您的 ResetPassword
:
[HttpGet]
public IActionResult ResetPassword(string code = null)
{
if (code == null)
{
return NotFound();
}
else
{
var model = new ResetPasswordViewModel
{
Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code))
};
return View(model);
}
}