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

Blazor自定义Select组件验证失败时无法添加'invalid'类的问题

解决方案

1. 修正TryParseValueFromString方法的逻辑错误

你的TryParseValueFromString返回值完全搞反了:转换成功时应返回true,失败时返回false。这个方法的返回值直接决定InputBase的验证状态,是核心问题。

修正后的代码:

protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out TValue result, [NotNullWhen(false)] out string? validationErrorMessage)
{
    if (BindConverter.TryConvertTo<TValue>(value, null, out result))
    {
        validationErrorMessage = null;
        return true; // 转换成功返回true
    }
    else
    {
        validationErrorMessage = "错误:选择值无效";
        return false; // 转换失败返回false
    }
}

2. 绑定InputBase的CssClass到组件根元素

InputBase内置CssClass属性,验证失败时会自动添加invalid类。你需要在组件根div中结合自定义类与该属性:

修改Select.razor:

<div id="select-@Id" class="component-select @CssClass" @ref="ReferenceToDiv">
    @foreach (var option in Options)
    {
        <div @onclick="() => OnSelect(option)" class="option">@option.Text</div>
    }
</div>

3. 优化OnSelect方法的验证触发逻辑

直接赋值CurrentValue虽能更新绑定,但通过CurrentValueAsString可触发完整验证流程,确保状态同步:

public void OnSelect(SelectOption? option)
{
    if (option == null) return;

    // 测试用:强制设置空值触发验证失败
    option.Value = "";

    // 通过CurrentValueAsString触发转换和验证
    CurrentValueAsString = option.Value;
    SelectedOption = option;

    // 触发外部回调(如果需要)
    if (OnSelected.HasDelegate)
    {
        OnSelected.InvokeAsync(this);
    }
}

4. 确保模型验证属性配置正确(可选)

确认AddDto.InvestmentEntityId字段带有对应验证属性,比如[Required],提交表单时才会触发验证:

public class YourDtoClass
{
    [Required(ErrorMessage = "请选择投资实体")]
    public string InvestmentEntityId { get; set; } = string.Empty;
}

原理说明

  • InputBase会根据TryParseValueFromString的结果和模型验证状态,自动维护CssClass中的invalid类。
  • 验证失败时,CssClass会包含invalid,绑定到根元素后即可自动应用样式,和Blazor内置组件行为一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:20:49