10分钟上手ASP.NET Core自定义验证:从数据安全到业务规则的完美实现

10分钟上手ASP.NET Core自定义验证:从数据安全到业务规则的完美实现

【免费下载链接】practical-aspnetcore 该项目提供了关于ASP.NET Core实际应用开发的一系列教程和示例,涵盖了从基础知识到高级主题,是一个实用的学习资源库。适合于想要掌握ASP.NET Core技术栈的开发者进行学习和参考。 【免费下载链接】practical-aspnetcore 项目地址: https://gitcode.com/gh_mirrors/pr/practical-aspnetcore

你是否还在为ASP.NET Core中的数据验证烦恼?使用内置特性总觉得不够灵活,手写验证逻辑又过于繁琐?本文将通过practical-aspnetcore项目中的实战案例,带你掌握自定义验证特性的实现技巧,让数据验证既安全又灵活。读完本文,你将学会如何从零开始创建业务导向的验证规则,并将其优雅地集成到ASP.NET Core应用中。

验证体系概览:从基础到自定义

ASP.NET Core提供了两种主要的验证方式:基于DataAnnotations的声明式验证和实现IValidatableObject接口的命令式验证。项目中的net10/validation-2/Program.cs展示了如何将两者结合,构建复杂业务规则。

// 基础验证特性与自定义逻辑结合
public class RouteInput : IValidatableObject 
{
    [Required]  // 内置验证特性
    public string Name { get; set; } = string.Empty;

    [Required]  // 内置验证特性
    public int Age { get; set; } = 1;

    // 自定义验证逻辑
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Name.Length > 10 && Age > 50)
        {
            yield return new ValidationResult(
                "Age must be less than 50 when name is longer than 10 characters", 
                [nameof(Age)]);
        }
    }
}

实战实现:三步打造业务验证规则

1. 基础架构搭建

首先需要在项目中配置验证服务,通过AddValidation()扩展方法启用内置验证功能:

// [net10/validation-2/Program.cs](https://link.gitcode.com/i/20746ef23e2124ecdd7e048430df2298/blob/1d11d5038778f7bc1ebbfb1ef655510787cc0924/projects/net10/validation-2/Program.cs?utm_source=gitcode_repo_files)
var builder = WebApplication.CreateBuilder();
builder.Services.AddValidation(); // 注册验证服务
var app = builder.Build();

2. 路由参数验证实现

通过[AsParameters]特性可以将路由参数绑定到模型,结合IValidatableObject实现复杂验证:

// 路由参数验证端点
app.MapGet("/validate/{name}/{age}", ([AsParameters]RouteInput input) =>
{
    return TypedResults.Ok(input);
});

项目提供了两个测试链接,可直接体验验证效果:

  • 有效路由:/validate/John/25(名称长度≤10且年龄≤50)
  • 无效路由:/validate/Jonathan-Brand/51(名称过长且年龄超限)

3. 高级特性:自定义ValidationAttribute

对于需要复用的验证逻辑,建议创建自定义ValidationAttribute。虽然项目中未直接提供示例,但可基于以下模式实现:

public class MaxAgeForLongNameAttribute : ValidationAttribute
{
    public int MaxAge { get; set; } = 50;
    public int NameLengthThreshold { get; set; } = 10;

    protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
    {
        var input = validationContext.ObjectInstance as RouteInput;
        if (input?.Name.Length > NameLengthThreshold && input.Age > MaxAge)
        {
            return new ValidationResult(
                $"Age must be less than {MaxAge} when name exceeds {NameLengthThreshold} characters",
                [nameof(Age)]);
        }
        return ValidationResult.Success;
    }
}

应用场景:从数据验证到业务保障

用户注册场景扩展

在实际应用中,可将此验证模式扩展到用户注册等场景:

public class RegisterModel : IValidatableObject
{
    [Required]
    [EmailAddress]
    public string Email { get; set; } = string.Empty;
    
    [Required]
    [MinLength(8)]
    public string Password { get; set; } = string.Empty;
    
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Password.Contains(Email, StringComparison.OrdinalIgnoreCase))
        {
            yield return new ValidationResult(
                "Password cannot contain email address", 
                [nameof(Password)]);
        }
    }
}

多场景验证对比

验证方式适用场景优点缺点
内置特性简单验证规则代码简洁灵活性不足
IValidatableObject复杂对象验证支持多字段联动无法复用
自定义Attribute通用验证逻辑可复用、易维护实现较复杂

项目资源与进一步学习

通过这些示例,你可以系统掌握从简单到复杂的ASP.NET Core验证实现方案。建议先从validation-2入手,理解基础架构后再扩展到自定义特性实现。

总结与最佳实践

自定义验证是ASP.NET Core中保障数据安全和业务规则的重要手段。在实际项目中,建议:

  1. 简单规则优先使用内置DataAnnotations
  2. 多字段联动验证采用IValidatableObject
  3. 通用逻辑封装为自定义ValidationAttribute
  4. 结合FluentValidation等库实现更复杂场景(参考sfa/wiki/Program.cs中的FluentValidation集成)

掌握这些技巧后,你的ASP.NET Core应用将拥有更健壮的数据验证体系,同时保持代码的可维护性和扩展性。立即克隆项目体验:git clone https://link.gitcode.com/i/20746ef23e2124ecdd7e048430df2298,开始你的验证之旅吧!

【免费下载链接】practical-aspnetcore 该项目提供了关于ASP.NET Core实际应用开发的一系列教程和示例,涵盖了从基础知识到高级主题,是一个实用的学习资源库。适合于想要掌握ASP.NET Core技术栈的开发者进行学习和参考。 【免费下载链接】practical-aspnetcore 项目地址: https://gitcode.com/gh_mirrors/pr/practical-aspnetcore

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值