属性检查是通过声明式元数据在字段层面嵌入验证规则的轻量校验方式,依赖框架自动触发,适用于非空、长度、格式等明确规则,需框架接管对象生命周期,支持内置与自定义属性扩展、类型系统集成及前端响应式反馈。

属性检查是实现灵活数据模型校验最常用也最轻量的方式——它不依赖运行时逻辑判断,而是通过声明式元数据(如注解、特性、类型定义)在字段层面嵌入验证规则,让框架自动触发、统一处理。
用内置验证属性快速覆盖常见场景
多数主流框架都提供开箱即用的验证属性,比如 .NET 的 [Required]、[Range]、[EmailAddress],Java 的 @NotNull、@Size,Spring 的 @Valid,PHP 的 google-api-php-client 中通过 {property}Type 和 {property}DataType 约定类型映射。这些属性直接加在模型字段上,框架在绑定或序列化时自动读取并执行校验。
- 适合规则明确、无需上下文判断的场景:非空、长度、格式、数值范围等
- 注意生效前提:必须由框架接管对象生命周期(如 MVC 的参数绑定、ORM 的 Save 操作),手动 new 对象不会触发
- 对非空值类型(如 int、DateTime)默认不校验“是否提供”,因它们总有默认值;需配合 Nullable
或包装类使用
通过自定义属性扩展业务规则
当内置属性无法满足需求时(例如“结束时间不能早于开始时间”“密码需包含大小写字母和数字”),可定义自己的验证属性类。核心是继承框架提供的基类(如 .NET 的 ValidationAttribute,Java 的 ConstraintValidator),重写验证逻辑。
- 保持验证逻辑与模型解耦,复用性强,多个实体可共用同一属性
- 支持传参定制,例如 [FutureDate(AllowToday = true)]
- 需配合分部类或模型扩展机制(如 ASP.NET Dynamic Data 要求为数据表创建分部类)才能注入到数据模型层
结合类型系统与映射约定强化结构校验
某些 SDK 或客户端库(如 google-api-php-client)将校验深度融入类型设计:Model 基类通过 $modelData 存储原始数据,靠 {property}Type 指定目标类、{property}DataType 指定容器类型,在 __set() 或 mapTypes() 阶段完成类型转换与基础校验。
- 天然支持嵌套对象、数组、Map 等复杂结构的逐层校验
- 利用 PHP 的 NULL_VALUE 标记区分“未设置”与“显式 null”,避免误判
- 校验发生在数据载入阶段,而非提交时,更适合 API 客户端的数据净化
搭配计算属性或响应式字段实现前端实时反馈
服务端属性检查保障最终一致性,而前端可借助计算属性(Vue)、ReactiveProperty(C#)、Observable(JS)等机制,把校验结果变成响应式状态。例如一个 email 字段对应一个 emailRule 计算属性,内部组合非空、正则、重复性检查,并返回 { valid: boolean, message: string } 结构。
- 用户输入时即时反馈,减少无效提交
- 跨字段依赖(如确认密码)自然形成响应链,无需手动监听事件
- 规则函数可独立单元测试,不耦合 UI 生命周期











