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

Razor Pages登录失败后保留表单输入值的实现问题咨询

ASP.NET Core Razor Pages 登录失败保留表单输入值的实现方案

核心思路:避免重定向,直接返回页面(优先推荐)

登录失败时不要用 RedirectToPage,因为重定向会触发新的 GET 请求,导致原有表单数据丢失。直接返回 Page() 就能保留用户输入值和验证状态,同时解决初始加载显示验证信息的问题。

具体代码实现

1. 定义登录模型类

public class LoginModel
{
    [Required(ErrorMessage = "请输入用户名")]
    public string Username { get; set; }

    [Required(ErrorMessage = "请输入密码")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

2. AccountModel 后台逻辑

public class AccountModel : PageModel
{
    // 默认 SupportsGet = false,GET 请求不会绑定该属性,避免初始加载触发验证
    [BindProperty]
    public LoginModel LoginInput { get; set; }

    public void OnGet()
    {
        // 初始加载时无需额外操作,LoginInput 为 null,不会触发验证
    }

    public IActionResult OnPost()
    {
        // 先验证表单格式
        if (!ModelState.IsValid)
        {
            // 格式验证失败,直接返回页面,保留用户输入值
            return Page();
        }

        // 执行实际登录验证逻辑(替换为你的业务代码)
        bool loginSuccess = false;
        if (!loginSuccess)
        {
            // 登录失败,添加全局错误信息,返回页面保留输入值
            ModelState.AddModelError(string.Empty, "用户名或密码错误");
            return Page();
        }

        // 登录成功,跳转主页
        return RedirectToPage("/Index");
    }
}

3. Account 页面视图

@page
@model AccountModel

<h1>登录</h1>

<!-- 显示全局错误信息 -->
@if (!ModelState.IsValid)
{
    <div class="alert alert-danger">
        @Html.ValidationSummary(false, "", new { @class = "text-danger" })
    </div>
}

<form method="post">
    <div class="form-group">
        <label asp-for="LoginInput.Username"></label>
        <input asp-for="LoginInput.Username" class="form-control" />
        <span asp-validation-for="LoginInput.Username" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="LoginInput.Password"></label>
        <input asp-for="LoginInput.Password" class="form-control" />
        <span asp-validation-for="LoginInput.Password" class="text-danger"></span>
    </div>
    <button type="submit" class="btn btn-primary">登录</button>
</form>

特殊场景:必须重定向时的处理

如果业务要求必须用 RedirectToPage,可以通过 TempData 序列化传递登录模型:

修改 AccountModel 的 OnPost 和 OnGet 方法

public void OnGet()
{
    // 从 TempData 中取出登录失败时的表单数据
    if (TempData.ContainsKey("FailedLoginModel"))
    {
        LoginInput = JsonSerializer.Deserialize<LoginModel>(TempData["FailedLoginModel"].ToString());
        // 手动添加错误信息到 ModelState
        ModelState.AddModelError(string.Empty, "用户名或密码错误");
    }
}

public IActionResult OnPost()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    bool loginSuccess = false;
    if (!loginSuccess)
    {
        // 序列化登录模型存入 TempData
        TempData["FailedLoginModel"] = JsonSerializer.Serialize(LoginInput);
        return RedirectToPage("./Account");
    }

    return RedirectToPage("/Index");
}

关键注意点

  • [BindProperty] 默认 SupportsGet = false,确保初始 GET 请求不会绑定属性,避免页面刚加载就显示验证错误。
  • 优先使用 return Page() 而非重定向,这是 Razor Pages 处理表单提交失败的标准方式,能自动保留表单状态。

内容的提问来源于stack exchange,提问作者amir parsa rezaie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:24