You need to enable JavaScript to run this app. Blazor嵌套组件无法高亮无效字段、不显示ValidationMessages问题
优惠活动
大模型
产品
解决方案
定价
更多

Blazor嵌套组件无法高亮无效字段、不显示ValidationMessages问题

问题根源

问题核心是嵌套组件内部的ValidationMessage绑定的表达式与父级EditContext存储的验证表达式不匹配:
子组件内写的() => TextValue、() => DateValue指向的是子组件自身的局部参数,和父表单关联的ProductModel的Name、AddedOn属性的表达式没有关联,ValidationMessage无法匹配到对应属性的验证错误,而ValidationSummary是遍历整个表单的所有错误,所以可以正常显示。

解决方案

修改子组件,接收对应属性的表达式与变更回调,使用父级传递的表达式绑定ValidationMessage即可:

修改后的 ChildComponent.razor

<div class="card">
    <div class="card-header">
        @(new MarkupString(Caption))
    </div>
    <div class="card-body">
        <input type="text" @bind-value=@TextValue @bind-value:after="() => TextValueChanged.InvokeAsync(TextValue)" />
        <ValidationMessage For=@TextValueExpression />
        
        <input type="datetime-local" @bind-value=@DateValue @bind-value:after="() => DateValueChanged.InvokeAsync(DateValue)" />
        <ValidationMessage For=@DateValueExpression />
    </div>
</div>

@code {
    [Parameter]
    public string Caption { get; set; }

    [Parameter]
    public string TextValue { get; set; }
    [Parameter]
    public EventCallback<string> TextValueChanged { get; set; }
    [Parameter]
    public System.Linq.Expressions.Expression<Func<string>> TextValueExpression { get; set; }

    [Parameter]
    public DateTime? DateValue { get; set; }
    [Parameter]
    public EventCallback<DateTime?> DateValueChanged { get; set; }
    [Parameter]
    public System.Linq.Expressions.Expression<Func<DateTime?>> DateValueExpression { get; set; }
}

修改 TestPage.razor 中子组件调用逻辑

将参数传递改为双向绑定,Blazor会自动传递对应的变更回调与属性表达式到子组件:

<ChildComponent Caption="嵌套组件"
                @bind-DateValue=@ProductModel.AddedOn
                @bind-TextValue=@ProductModel.Name />

修改完成后嵌套组件内的ValidationMessage就可以正常匹配到对应属性的验证错误并显示。


内容的提问来源于stack exchange,提问作者GritKit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:57:03