我得到了这个“FormatException:输入字符串的格式不正确”在我看来,当使用用户令牌重置密码时

问题描述

我没有 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);
    }
}