Blazor使用ValidationMessage时如何命名子对象属性适配服务端校验
问题根因
你当前自定义ServerSideValidator的DisplayErrors方法中,直接通过CurrentEditContext.Field(elementId)生成FieldIdentifier的逻辑,仅适配根模型的直接属性。
对于嵌套属性model.Child.Property,绑定控件时用表达式() => model.Child.Property生成的FieldIdentifier结构为:
- 关联模型实例:
model.Child - 字段名:
Property
而你传入"Child.Property调用CurrentEditContext.Field得到的FieldIdentifier结构为:
- 关联模型实例:根模型
model - 字段名:
"Child.Property"
二者完全不匹配,所以错误无法绑定到对应的输入字段上,仅会在ValidationSummary中全局展示。
解决方案
推荐直接修改校验组件的DisplayErrors方法,让它支持解析点分隔的嵌套属性路径,自动生成正确的FieldIdentifier,修改后的代码如下:
public void DisplayErrors(Dictionary<string, List<string>> errors) { foreach (var (propertyPath, errorsForElement) in errors) { var pathSegments = propertyPath.Split('.'); object currentModel = CurrentEditContext.Model; string finalFieldName = pathSegments[^1]; // 逐级解析路径,获取嵌套属性的关联模型实例 for (int i = 0; i < pathSegments.Length - 1; i++) { var propertyInfo = currentModel.GetType().GetProperty(pathSegments[i]); if (propertyInfo == null) break; currentModel = propertyInfo.GetValue(currentModel); if (currentModel == null) break; } if (currentModel != null) { _messageStore.Add(new FieldIdentifier(currentModel, finalFieldName), errorsForElement); } } CurrentEditContext.NotifyValidationStateChanged(); }
修改完成后你不需要调整服务端填充错误的逻辑,只需要保证错误的key和C#属性名的大小写完全一致即可,比如子属性名为Address,子属性的字段名为Street,key就写Address.Street,不要写成小写的address.street。
验证方法
如果修改后仍有问题,可以在前端代码中加一行调试代码,打印对应字段的标准路径,直接用打印结果作为错误key即可:
// 输出的结果就是该字段对应的正确错误key var correctKey = FieldIdentifier.Create(() => model.Child.Property).Path; Console.WriteLine(correctKey);
内容的提问来源于stack exchange,提问作者Erre Efe
相关产品推荐
相关产品推荐

