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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:50:25