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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:03:11