You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:42:38