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

AspNetBoilerplate客户端验证问题:如何实现ASP.NET Core式校验?

关于ABP ASP.NET Core MVC模型验证的解决方案

嗨,我之前也碰到过一模一样的困惑,给你梳理下两种清晰的解决思路:

一、启用原生jQuery Unobtrusive客户端验证

ABP完全兼容ASP.NET Core原生的客户端验证机制,你只需要确保以下几步配置到位:

  • 引入必要的JS文件:
    先确认项目里有jQuery、jquery.validate和jquery.validate.unobtrusive这三个文件,可以通过LibMan或npm安装,然后在_Layout.cshtml的body末尾引用它们:

    <script src="~/lib/jquery/jquery.min.js"></script>
    <script src="~/lib/jquery-validation/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
    
  • 确认客户端验证开关已打开:
    在Program.cs(旧版本是Startup.cs)里,确保MVC的客户端验证和非侵入式JS是启用状态,ABP模板一般默认配置了,但可以再核对下:

    builder.Services.AddMvc(options =>
    {
        options.ClientValidationEnabled = true;
        options.UnobtrusiveJavaScriptEnabled = true;
    });
    
  • 视图里正确用Tag Helper生成表单:
    编写表单时,用asp-for标签助手生成输入框,它会自动根据模型上的[StringLength]、[Required]等验证特性,生成data-val开头的验证属性,Unobtrusive会自动识别这些属性并在客户端做实时验证:

    <form asp-action="Create">
        <div class="form-group">
            <label asp-for="Oib"></label>
            <input asp-for="Oib" class="form-control" />
            <span asp-validation-for="Oib" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-primary">提交</button>
    </form>
    

    这样配置后,用户输入不符合规则的内容时,点击提交会直接在页面弹出错误提示,根本不会把请求发到服务端。

二、处理服务端的AbpValidationException

如果用户绕过了客户端验证(比如手动修改请求),ABP默认会在进入控制器前抛出AbpValidationException,你可以选两种方式处理:

方式1:关闭ABP自动验证,回到原生MVC逻辑

如果你想和普通ASP.NET Core MVC一样,让模型错误进入控制器方法,自己通过ModelState.IsValid判断,可以关闭ABP的自动验证:

builder.Services.Configure<AbpValidationOptions>(options =>
{
    // 关闭自动验证表单请求,模型错误会进入控制器处理
    options.AutoValidateFormRequests = false;
});

之后控制器方法就可以像原生MVC那样写:

[HttpPost]
public IActionResult Create(CreateSubjektInput input)
{
    if (!ModelState.IsValid)
    {
        return View(input);
    }
    // 后续业务逻辑
    return RedirectToAction("Index");
}

方式2:全局捕获异常,返回友好错误视图

如果你想保留ABP的自动验证,但希望异常抛出后能在原视图显示错误,可以自定义异常过滤器:

public class AbpValidationExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        if (context.Exception is AbpValidationException validationException)
        {
            foreach (var error in validationException.ValidationErrors)
            {
                context.ModelState.AddModelError(error.MemberNames.FirstOrDefault() ?? string.Empty, error.ErrorMessage);
            }
            context.Result = new ViewResult { ViewData = new ViewDataDictionary(context.ModelState) };
            context.ExceptionHandled = true;
        }
    }
}

然后在Program.cs里注册这个过滤器:

builder.Services.AddMvc(options =>
{
    options.Filters.Add<AbpValidationExceptionFilter>();
});

关于文档里的纯JS验证

文档里的纯JS验证更多是给SPA(比如Angular、React)场景准备的,在MVC项目里完全不用纠结,用原生的Unobtrusive验证就足够方便了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:22