如何在C#中为ValidationAttribute自定义响应格式?
自定义ValidationAttribute的验证响应格式改造
当然可以创建自定义响应,以下是针对ASP.NET Core环境的具体实现方案,既能替换默认的嵌套错误格式,又能包含前端动态传入的字符串:
一、定义自定义错误响应模型
先创建符合需求的响应结构,示例如下:
public class CustomValidationErrorResponse { public int StatusCode { get; set; } public string Message { get; set; } public string FieldName { get; set; } public string InputValue { get; set; } // 存储前端传入的待验证字符串 public string TraceId { get; set; } }
二、全局替换验证错误响应工厂
在Program.cs中配置ApiBehaviorOptions,替换默认的错误响应生成逻辑,所有验证错误都会使用自定义格式:
builder.Services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { // 获取第一个验证错误的字段和信息 var errorEntry = context.ModelState.FirstOrDefault(entry => entry.Value.Errors.Any()); var fieldName = errorEntry.Key; var errorMsg = errorEntry.Value.Errors.First().ErrorMessage; // 获取前端传入的该字段实际值 var inputValue = context.HttpContext.Request.Form[fieldName].FirstOrDefault(); var customResponse = new CustomValidationErrorResponse { StatusCode = StatusCodes.Status400BadRequest, Message = errorMsg, FieldName = fieldName, InputValue = inputValue, TraceId = context.HttpContext.TraceIdentifier }; return new BadRequestObjectResult(customResponse); }; });
三、优化自定义ValidationAttribute(可选)
如果需要在验证逻辑中直接使用动态错误信息,可修改你的CustomRegexValidator,支持自定义错误模板或传入待验证值:
using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; public class CustomRegexValidator : ValidationAttribute { private readonly string _regexPattern; public CustomRegexValidator(string pattern = "^[a-zA-Z0-9]+(?:-?[a-zA-Z0-9]+)+$") { _regexPattern = pattern; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || !Regex.Match((string)value, _regexPattern).Success) { // 错误消息中包含前端传入的实际值 var errorMsg = string.Format(ErrorMessage ?? "Invalid format for input: {0}", value); return new ValidationResult(errorMsg); } return ValidationResult.Success; } }
四、局部拦截(可选)
如果不需要全局生效,可创建Action过滤器,仅对特定控制器/Action生效:
public class CustomValidationFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { var errorEntry = context.ModelState.FirstOrDefault(entry => entry.Value.Errors.Any()); var fieldName = errorEntry.Key; var errorMsg = errorEntry.Value.Errors.First().ErrorMessage; var inputValue = context.HttpContext.Request.Form[fieldName].FirstOrDefault(); var customResponse = new CustomValidationErrorResponse { StatusCode = StatusCodes.Status400BadRequest, Message = errorMsg, FieldName = fieldName, InputValue = inputValue, TraceId = context.HttpContext.TraceIdentifier }; context.Result = new BadRequestObjectResult(customResponse); } } }
使用时在控制器或Action上添加[CustomValidationFilter]特性即可。
内容的提问来源于stack exchange,提问作者Ben F
相关产品推荐
相关产品推荐

