ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

集合与索引器校验避坑指南:Blazored.FluentValidation 如何兼容 C 12 集合表达式

集合与索引器校验避坑指南:Blazored.FluentValidation 如何兼容 C 12 集合表达式 集合与索引器校验避坑指南Blazored.FluentValidation 如何兼容 C# 12 集合表达式【免费下载链接】FluentValidationA library for using FluentValidation with Blazor项目地址: https://gitcode.com/gh_mirrors/flue/FluentValidationBlazored.FluentValidation 是一款专为 Blazor 打造的 FluentValidation 集成库让开发者可以在EditForm中无缝使用 FluentValidation 规则校验表单模型。当你的模型里包含集合属性如数组、ListT、IReadOnlyListT并且表单界面通过索引器如Addresses[0].Town绑定字段时校验路径的解析就成了最容易踩坑的地方——尤其是在升级到 C# 12 并使用集合表达式Collection Expressions之后。本文就用通俗的语言帮你避开这些坑。️ 坑在哪里C# 12 集合表达式的隐藏类型C# 12 引入了新的集合表达式语法比如[1, 2, 3]或者[new Address(), new Address()]。它比传统的new ListT { ... }更简洁但编译期会生成一个编译器内部的隐藏类型形如z__ReadOnlyArray。这个隐藏类型有两个反直觉的特点没有公开的Item索引器属性——而 Blazor 的FieldIdentifier解析索引路径时第一步就是通过反射查找Item属性。无法被直接转换为object[]——导致原本按数组处理的分支也失效。结果就是当校验器抛出Could not find indexer on object of type ...异常时十有八九是集合表达式惹的祸。 源码如何修复IReadOnlyList 兜底方案在 EditContextFluentValidationExtensions.cs 的ToFieldIdentifier方法约第 181–273 行中路径解析遵循三段式策略查找Item索引器属性常规ListT都能走通。尝试转换为object[]兼容传统数组。尝试转换为IReadOnlyListobject兜底这正是针对 C# 12 集合表达式生成的z__ReadOnlyArray的专门修复源码约第 232–241 行。else if (obj is IReadOnlyListobject readOnlyList) { // 解决 C# 12 集合表达式生成 z__ReadOnlyArray 的问题 // 它既没有 Item 属性也无法成功转换为 object[] // 因此直接使用索引器按序号访问元素。 var indexerValue int.Parse(nextToken); newObj readOnlyList[indexerValue]; }这意味着只要你的集合能被当作IReadOnlyListobject访问索引器校验就能正常执行。 路径是怎么拼出来的PropertyPathHelper字段校验时PropertyPathHelper.cs 负责把EditContext的FieldIdentifier还原成 FluentValidation 认识的属性路径字符串。它通过栈结构遍历模型逐层记录普通属性 → 拼成Parent.Child集合元素 → 拼成Parent.Collection[索引]最终生成类似Addresses[0].Town、Orders[2].Items[1].Price的完整路径。也就是说索引器路径的正确性是整套集合校验的地基一旦解析失败ValidateField会直接返回空路径并放弃校验。⚠️ 避坑清单集合与索引器校验的 5 个要点避坑要点建议做法集合表达式类型尽量使用显式类型如ListT、数组或确保类型可被当作IReadOnlyListobject访问索引器路径格式记住 Blazor 的FieldIdentifier路径使用集合名[序号].属性的写法泛型集合的元素使用RuleForEach(x x.Items)逐元素校验时子属性错误路径会自动带上索引空集合与空元素路径解析遇到null实例会提前返回别指望对 null 元素继续取属性异常信息看到Could not find indexer时优先怀疑集合表达式或自定义索引器类型✅ 最佳实践写校验规则时的正确姿势一个典型的人 多个地址模型推荐这样组织模型类参考测试模型 Person.cs中地址用ListAddress或数组声明校验器用RuleForEach(p p.Addresses).SetValidator(new AddressValidator())完成嵌套集合校验表单里用bind-Value_person.Addresses[i].Town绑定索引器字段FluentValidationValidator /会自动处理路径映射参考 FluentValidationsValidator.cs。这样一来无论数据来自 DI 注入的验证器还是程序集扫描集合与索引器校验都能稳定工作。 总结C# 12 集合表达式让代码更简洁但也让 Blazor 的字段路径解析多了一层隐藏类型的考验。Blazored.FluentValidation 通过IReadOnlyListobject兜底分支EditContextFluentValidationExtensions.cs优雅地兼容了这类集合你只需要记住集合声明尽量显式、索引路径别写错、异常先查类型。掌握了这三点集合与索引器校验就不再是坑而是你表单校验的得力助手。【免费下载链接】FluentValidationA library for using FluentValidation with Blazor项目地址: https://gitcode.com/gh_mirrors/flue/FluentValidation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表