ASP.NET MVC中每次Post请求时int字段重置为0的问题求助
问题解决:忘记密码页面尝试次数每次POST重置为0
核心原因
你的视图中没有将ForgetAttempt字段包含在表单提交内容里,每次POST请求时,模型绑定会创建一个全新的ForgetPasswordModel实例,int类型的ForgetAttempt默认值为0,导致你在控制器中做的递增操作无法在后续请求中保留。
解决方案
1. 修改视图,添加隐藏字段传递尝试次数
在表单内部(Html.BeginForm代码块中)添加@Html.HiddenFor(m => m.ForgetAttempt),确保每次提交表单时都会把当前的尝试次数传递回控制器:
@model AuthFrameworkMVCSite.Models.Portal.ForgetPasswordModel @{ ViewBag.Title = "View"; Layout = "~/Views/Shared/_LayoutAuthFramework.cshtml"; } @using (Html.BeginForm("ForgetPassword", "Portal", FormMethod.Post)) { @Html.AntiForgeryToken() <!-- 添加隐藏字段保存尝试次数 --> @Html.HiddenFor(m => m.ForgetAttempt) <h2>Username/Email Address</h2> @Html.TextBoxFor(m => m.AccountName) <br /> <br /> <input type="submit" value="Reset Password" /> if (ViewBag.ShowForgetPasswordError == true) { <div class="col-lg-offset-3 col-lg-6"> Something went wrong. Please try again. </div> } } <div id="loader" style="display:none"> Loading... </div>
2. 调整控制器逻辑,完善尝试次数校验
修改控制器方法,先处理尝试次数递增,再判断是否超过阈值,确保验证逻辑生效:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult ForgetPassword(Models.Portal.ForgetPasswordModel forgetPasswordModel) { // 先递增尝试次数,本次请求已算一次尝试 forgetPasswordModel.ForgetAttempt += 1; // 检查是否超过阈值(这里以5次为例) if (forgetPasswordModel.ForgetAttempt > 5) { ModelState.AddModelError("", "尝试次数过多,请稍后再试"); return View(forgetPasswordModel); } if (ModelState.IsValid) { forgetPasswordModel.isEmail = Helper.Validation.IsValiEmailAddress(forgetPasswordModel.AccountName); if (forgetPasswordModel.ForgetPasswordReset == Models.Portal.ForgetPasswordReset.Success) { // 重置密码成功后,可跳转或重置尝试次数 return RedirectToAction("ResetPassword", "Portal", new Models.Portal.ResetPasswordModel()); } else { ViewBag.ShowForgetPasswordError = true; } } return View(forgetPasswordModel); }
进阶优化(可选)
如果需要跨会话保留尝试次数(比如用户关闭浏览器重新打开后仍限制),可以将尝试次数存储在Session或数据库中,而非仅依赖客户端隐藏字段:
- 使用Session:
Session["ForgetAttempt_" + forgetPasswordModel.AccountName] = forgetPasswordModel.ForgetAttempt;,每次请求时从Session读取并赋值给模型。 - 使用数据库:为用户记录尝试次数,每次请求时查询、更新,这种方式更安全,能防止客户端篡改隐藏字段的值。
内容的提问来源于stack exchange,提问作者user1257758
相关产品推荐
相关产品推荐

