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

.NET登录表单三大问题求助:模型未接收数据、验证提示不显示等

.NET登录表单三大问题修复指南

问题描述

完全参照教程实现登录表单,但出现三类异常:

  • 输入框为空时,验证提示span不显示
  • 表单提交后,控制器模型未接收到数据
  • 登录结果的提示alert无法显示
    已重新编写视图和模型但问题依旧,同款代码在课程中可正常运行,项目中其他模型视图功能正常。

相关代码

模型代码

public class UsuarioM
{
    public int Id { get; set; }
    [Required(ErrorMessage = "用户名是必填项")]
    public string Usuario { get; set; }
    [Required(ErrorMessage = "密码是必填项")]
    [StringLength(10, MinimumLength = 4, ErrorMessage = "密码长度必须在4到10个字符之间")]
    public string Password { get; set; }
    public string Token { get; set; }
}

控制器代码

[HttpGet]
public IActionResult Login()
{
    UsuarioM usuario = new UsuarioM();
    return View(usuario);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(UsuarioM usuario)
{
    if (ModelState.IsValid)
    {
        if (ModelState.IsValid)
        {
            UsuarioM user = await _cuentaRepositorio.IngresarAsync(Constantes.rutaUsuario + "Login", usuario);
            if (user.Token == null)
            {
                TempData["alert"] = "用户名或密码错误";
                return View();
            }
            ClaimsIdentity identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
            identity.AddClaim(new Claim(ClaimTypes.Name, usuario.Usuario));
            
            ClaimsPrincipal principal = new ClaimsPrincipal(identity);
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
            
            HttpContext.Session.SetString("JWToken", user.Token);
            TempData["alert"] = $"欢迎回来,{user.Usuario}";
            return RedirectToAction("Index");
        }
        else
        {
            return View();
        }
    }
    else
    {
        return View();
    }
}

Razor视图代码

@model PeliculasWeb.Models.UsuarioM
@{
    ViewData["Title"] = "登录";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1 class="text-center">用户登录</h1>

<div class="row mt-4">
    <div class="col-sm-12">
        @if (TempData["alert"] != null)
        {
            <div class="alert alert-danger alert-dismissible fade show" role="alert">
                <h5><strong>@TempData["alert"]</strong></h5>
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
        }
    </div>
</div>

<div class="row">
    <div class="col-sm-6 offset-3">
        <form asp-action="Login">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label for="Usuario">用户名:</label>
                <input type="text" asp-for="Usuario" class="form-control" placeholder="请输入用户名" />
                <span asp-validation-for="Usuario" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label for="contrasenia">密码:</label>
                <input type="password" asp-for="Password" class="form-control" placeholder="请输入密码" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>
            <button type="submit" class="btn btn-primary w-100">登录</button>
        </form>
    </div>
</div>

针对性修复方案

1. 验证提示不显示修复

  • 检查脚本依赖:确保_Layout.cshtml中已引入客户端验证所需的脚本,ASP.NET Core默认依赖以下三个文件:
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
    
  • 确认视图中asp-validation-for标签与模型属性名完全匹配(你的代码中已正确绑定,无需修改)。

2. 模型未接收数据修复

  • 修改表单提交方法:控制器的Login方法标记了[HttpPost],但表单默认使用GET提交,需修改form标签:
    <form asp-action="Login" asp-method="post">
    
  • 防伪令牌检查:确认视图源代码中存在__RequestVerificationToken隐藏字段(Razor表单使用asp-action时会自动生成,若缺失需手动添加:@Html.AntiForgeryToken())。

3. Alert提示不显示修复

  • 修复控制器逻辑:
    • 移除冗余的if (ModelState.IsValid)嵌套,避免逻辑混乱;
    • 返回视图时必须传递模型实例,否则模型状态和用户输入会丢失:
      // 登录失败时
      TempData["alert"] = "用户名或密码错误";
      return View(usuario); // 传递原模型
      
      // ModelState无效时
      TempData["alert"] = "请填写所有必填字段";
      return View(usuario);
      
  • Bootstrap JS依赖:确保_Layout.cshtml引入Bootstrap的JS文件,否则alert的动态效果(如关闭按钮)无法正常工作:
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    

内容的提问来源于stack exchange,提问作者Eduardo Meza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:15:10