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

是否存在与JSR 303/349等效的C#(.NET)输入校验方案?

.NET中REST API输入校验的等效方案(对应Java JSR 303/349)

在.NET生态中,有多种成熟的输入校验方案可对应Java的JSR 303/349(Bean Validation),核心方案如下:

1. 原生数据注解(Data Annotations)

这是.NET官方提供的基础校验方式,和JSR 303的注解模式逻辑一致,通过特性(Attribute)标记模型的校验规则,ASP.NET Core框架会自动执行校验。

示例代码:

public class UserCreateDto
{
    [Required(ErrorMessage = "用户名不能为空")]
    [StringLength(50, MinimumLength = 3, ErrorMessage = "用户名长度需在3-50字符之间")]
    public string Username { get; set; }

    [Required(ErrorMessage = "邮箱不能为空")]
    [EmailAddress(ErrorMessage = "邮箱格式不正确")]
    public string Email { get; set; }

    [Range(18, 100, ErrorMessage = "年龄需在18-100之间")]
    public int Age { get; set; }
}

在ASP.NET Core控制器中,只要标记[ApiController]特性,框架会自动校验请求模型,若校验失败直接返回包含错误信息的400响应,无需手动调用校验方法。

2. FluentValidation(第三方灵活校验库)

如果需要处理复杂校验逻辑(比如多属性关联校验、自定义规则),FluentValidation是.NET生态中最流行的选择,功能类似JSR 303的扩展实现(如Hibernate Validator)。

示例代码:

首先安装NuGet包:Install-Package FluentValidation.AspNetCore

创建校验器类:

public class UserCreateDtoValidator : AbstractValidator<UserCreateDto>
{
    public UserCreateDtoValidator()
    {
        RuleFor(x => x.Username)
            .NotEmpty().WithMessage("用户名不能为空")
            .Length(3, 50).WithMessage("用户名长度需在3-50字符之间");

        RuleFor(x => x.Email)
            .NotEmpty().WithMessage("邮箱不能为空")
            .EmailAddress().WithMessage("邮箱格式不正确");

        RuleFor(x => x.Age)
            .InclusiveBetween(18, 100).WithMessage("年龄需在18-100之间");

        // 自定义关联校验示例
        RuleFor(x => x.Email)
            .Must((dto, email) => !email.Contains(dto.Username))
            .WithMessage("邮箱不能包含用户名");
    }
}

在Startup/Program.cs中注册校验器:

builder.Services.AddControllers()
    .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<UserCreateDtoValidator>());

注册后,ASP.NET Core会自动应用这些校验规则,返回标准的错误响应。

3. 自定义校验逻辑

若以上方案无法满足需求,可实现IValidatableObject接口,在模型类中编写自定义校验逻辑:

示例代码:

public class UserCreateDto : IValidatableObject
{
    public string Username { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!string.IsNullOrEmpty(Email) && Email.Contains(Username))
        {
            yield return new ValidationResult("邮箱不能包含用户名", new[] { nameof(Email) });
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:40:44