.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">×</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
相关产品推荐
相关产品推荐

