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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:09:02