ASP.NET MVC表单验证不生效,请求正确实现与问题排查
ASP.NET MVC表单验证规则不生效排查与解决
问题描述
在ASP.NET MVC中实现表单验证时,验证规则完全不生效,也不显示错误提示。填写内容时表单可正常提交,POST请求能正常执行,但所有验证要求均未被强制执行。
绑定表单的ViewModel代码
using System.ComponentModel.DataAnnotations; namespace PastaShop.Models { public class PersoonViewModel:IValidatableObject { [Display(Name ="Naam")] [Required(ErrorMessage = "je moet een naam ingeven !")] public string? Naam { get; set; } [Display(Name = "Voornaam")] [Required(ErrorMessage = "je moet een voornaam ingeven !")] public string? Voornaam { get; set; } [Display(Name = "Email")] [Required(ErrorMessage ="je moet een Email ingeven !")] [EmailAddress] public string? Email { get; set; } [Display(Name = "Telefoon")] [Required(ErrorMessage = "je moet een Email ingeven !")] public string? Telefoon { get; set; } [Display(Name = "Geboortedatum")] [Required(ErrorMessage = "je moet een datum ingeven !")] public DateTime Geboortedatum { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var validationResults = new List<ValidationResult>(); if (DateTime.Compare(Geboortedatum, DateTime.Now) > 0) { validationResults.Add(new ValidationResult("GeboorteDatum is in de toekomst !")); } return validationResults; } } }
对应的CSHTML视图代码
@{ ViewData["Title"] = "Nieuwsbrief"; } <h1>Nieuwsbrief</h1> @model PersoonViewModel @{ ViewBag.Title = "Nieuwsbrief"; } <div id="niewsbriefForm"> <form asp-action="bevestigNieuwsBrief" method="post"> <label asp-for="Naam"></label> <input type="text" asp-for="Naam" /> <span asp-validation-for="Naam"></span> <br /> <label asp-for="Voornaam"></label> <input type="text" asp-for="Voornaam" /> <span asp-validation-for="Voornaam"></span> <label asp-for="Email"></label> <input type="email" asp-for="Email" /> <span asp-validation-for="Email"></span> <label asp-for="Telefoon"></label> <input type="text" asp-for="Telefoon" /> <span asp-validation-for="Telefoon"></span> <label asp-for="Geboortedatum"></label> <input type="text" asp-for="Geboortedatum" /> <span asp-validation-for="Geboortedatum"></span> <input type="submit" value="Bevestigen" class="btn btn-primary" /> <div asp-validation-summary="All">Er zijn Validatiefouten! </div> </form> </div>
HomeController中的相关Action代码
public IActionResult Nieuwsbrief() { var nieuwsbriefViewModel = new PersoonViewModel(); return View(nieuwsbriefViewModel); } [HttpPost] public IActionResult BevestigNieuwsBrief(PersoonViewModel persoonViewModel) { if (this.ModelState.IsValid) { var persoon = new Persoon(); persoon.Email = persoonViewModel.Email; persoon.Naam = persoonViewModel.Voornaam; return View(persoon); } else { return RedirectToAction(nameof(Nieuwsbrief)); } }
问题排查与解决方案
1. Controller验证失败后的逻辑错误
POST Action中,当ModelState.IsValid为false时,使用RedirectToAction重定向会丢失原ModelState中的错误信息,导致视图无法显示验证提示。
修复:
直接返回原视图并传入当前ViewModel,保留错误状态:
[HttpPost] public IActionResult BevestigNieuwsBrief(PersoonViewModel persoonViewModel) { if (this.ModelState.IsValid) { var persoon = new Persoon(); persoon.Email = persoonViewModel.Email; persoon.Naam = persoonViewModel.Voornaam; return View(persoon); } // 返回原表单视图,保留验证错误 return View("Nieuwsbrief", persoonViewModel); }
2. 缺失客户端验证脚本
ASP.NET MVC客户端验证依赖jquery.validate.js和jquery.validate.unobtrusive.js,未引入则客户端验证不触发,错误提示样式也无法正常显示。
修复:
在视图或布局页中添加脚本引用(确保已先引入jQuery):
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
ASP.NET Core项目需确保已安装Microsoft.jQuery.Unobtrusive.Validation NuGet包。
3. ViewModel字段错误提示信息错误
Telefoon字段的Required提示信息写错为邮箱相关,虽不影响验证逻辑,但会导致提示内容错误,建议修正:
[Display(Name = "Telefoon")] [Required(ErrorMessage = "je moet een telefoonnummer ingeven !")] public string? Telefoon { get; set; }
4. Geboortedatum字段的DateTime类型问题
DateTime是值类型,默认值为DateTime.MinValue,Required特性对值类型始终通过验证,导致该字段必填规则失效。
修复:
改为可空DateTime类型,并调整自定义验证逻辑:
[Display(Name = "Geboortedatum")] [Required(ErrorMessage = "je moet een datum ingeven !")] public DateTime? Geboortedatum { get; set; } // 自定义验证逻辑更新 public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var validationResults = new List<ValidationResult>(); if (Geboortedatum.HasValue && DateTime.Compare(Geboortedatum.Value, DateTime.Now) > 0) { // 指定字段名称,让错误提示显示在对应位置 validationResults.Add(new ValidationResult("GeboorteDatum is in de toekomst !", new[] { nameof(Geboortedatum) })); } return validationResults; }
5. 客户端验证属性未生成
检查浏览器开发者工具中输入框的HTML源码,确认是否有data-val="true"、data-val-required等属性。若没有,需在视图顶部添加ViewModel命名空间引用:
@using PastaShop.Models
内容的提问来源于stack exchange,提问作者Exoflame
相关产品推荐
相关产品推荐

