AspNetBoilerplate客户端验证问题:如何实现ASP.NET Core式校验?
嗨,我之前也碰到过一模一样的困惑,给你梳理下两种清晰的解决思路:
一、启用原生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

