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

.NET Core 8中FluentValidation无法验证MudSelect组件问题排查

问题:MudBlazor中MudSelect绑定Motion属性未触发FluentValidation验证

在.NET Core 8 + MudBlazor环境下,构建新增Dance的表单并绑定Dance模型,配置FluentValidation验证规则后,绑定Motion属性的MudSelect组件始终未触发验证,具体表现:

  • 直接为Dance的Motion属性添加NotNull规则时,调试ValidateValue方法看不到该属性的验证过程;
  • 配置Motion独立验证器并通过SetValidator关联时,子验证器未触发;
  • 将MudSelect单独作为表单验证始终返回有效。

核心原因

MudSelect组件未配置For参数,导致表单无法将组件与模型的Motion属性建立关联,验证逻辑无法定位到该字段进行校验。

解决方案

1. 为MudSelect添加For参数

修改表单中的MudSelect代码,添加For参数关联模型的Motion属性,让表单识别该组件对应的验证字段:

<MudSelect @bind-Value="model.Motion" 
           For="@(() => model.Motion)"
           Label="Select Motion" 
           Placeholder="Please Select">
    @foreach (Motion item in Motions)
    {
        <MudSelectItem Value="@item">@item.DisplayName</MudSelectItem>
    }
</MudSelect>

2. 规范Dance验证器的规则(修复重复定义)

原DanceFluentValidator中重复定义了DisplayName的验证规则,移除重复项避免逻辑混乱:

public class DanceFluentValidator : AbstractValidator<Dance>
{
    public DanceFluentValidator()
    {
        RuleFor(x => x.DisplayName)
            .NotEmpty()
            .Length(1, 100);
        RuleFor(x => x.Letter)
            .NotEmpty()
            .Length(1, 1);
        RuleFor(x => x.Level)
            .NotEmpty();
        RuleFor(x => x.Motion).NotNull().WithMessage("Please select a motion");
        RuleFor(x => x.ValidFrom).NotNull().WithMessage("Valid From Date is not a valid date.");
        RuleFor(x => x.ValidUntil).NotNull().WithMessage("Valid Until Date is not a valid date.");
    }

    private async Task<bool> IsUniqueAsync(string email)
    {
        await Task.Delay(2000);
        return email.ToLower() != "test@test.com";
    }

    public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) =>
    {
        var result = await ValidateAsync(ValidationContext<Dance>.CreateWithOptions((Dance)model, x => x.IncludeProperties(propertyName)));
        
        if (result.IsValid)
            return Array.Empty<string>();
        return result.Errors.Select(e => e.ErrorMessage);
    };
}

3. 嵌套验证的正确配置(如需验证Motion内部属性)

若需要同时验证Motion的DisplayName等内部属性,需在父验证器中先校验Motion不为null,再关联子验证器:

public class MotionFluentValidator : AbstractValidator<Motion>
{
    public MotionFluentValidator()
    {
        RuleFor(x => x.DisplayName).NotEmpty().Length(1, 99);
    }
}

public class DanceFluentValidator : AbstractValidator<Dance>
{
    public DanceFluentValidator()
    {
        // ... 其他规则
        RuleFor(x => x.Motion)
            .NotNull().WithMessage("Please select a motion")
            .SetValidator(new MotionFluentValidator());
        // ... 其他规则
    }
}

4. 验证触发测试

提交表单时调用await form.Validate(),会触发所有字段的验证;若需要实时验证,可给MudSelect添加Immediate="true"参数,选择时立即触发验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:24:59