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

为何搭配FluentValidation的MudBlazor SelectList会抛出验证函数错误异常

问题根因
  • MudSelectItem绑定错误:所有选项的Value属性错误绑定为当前选中值@Model.Item,无法正确更新模型属性,导致校验触发时取值异常
  • 校验器代码错误:自定义校验委托中使用未定义的泛型参数T,且委托名与父类自带的Validate方法重名,会触发递归调用或空引用异常
  • 依赖注入不匹配:AddValidatorsFromAssemblyContaining默认注册的是IValidator<ItemModel>接口,直接注入具体实现类ValidateItemModel可能导致注入失败,出现空引用
解决方案

步骤1:修复下拉选项绑定

将MudSelectItem的Value属性改为绑定循环变量item:

@inject ValidateItemModel validator

<MudItem xs="12" md="4">
    <MudSelect T="string" @bind-Value="@Model.Item" Validation="validator.DoValidate">
        @foreach (var item in Model.Items)
        {
            <MudSelectItem T="string" Value="@item">@item</MudSelectItem>
        }
    </MudSelect>
</MudItem>

步骤2:修复校验器代码

修正泛型参数,重命名自定义校验委托避免重名冲突:

public class ItemModel
{
    public ItemModel()
    {
        Items = new string[]{"A","B","C"};
    }
    public string[] Items {get;set;}
    public string Item {get;set;} = string.Empty;
}

public class ValidateItemModel : AbstractValidator<ItemModel>
{
    public ValidateItemModel()
    {
        RuleFor(_ => _.Item).NotEmpty()
            .WithMessage("You need to select an item");
    }

    public Func<object, string, IEnumerable<string>> DoValidate => (model, propertyName) =>
    {
        var result = Validate(ValidationContext<ItemModel>.CreateWithOptions((ItemModel)model, 
        x => x.IncludeProperties(propertyName)));

        if (result.IsValid)
            return Array.Empty<string>();
        return result.Errors.Select(e => e.ErrorMessage);
    };
}

步骤3:修正依赖注入配置

注册具体校验器实现类到DI容器:

services.AddValidatorsFromAssemblyContaining<ValidateItemModel>();
// 补充注册具体实现类
services.AddTransient<ValidateItemModel>();

可选简化方案

如果你的选择器包裹在MudForm组件内,可直接使用FluentValidation自动校验能力,无需自定义校验委托:

  1. 为MudForm指定Model="@Model"和Validator="@validator"属性
  2. 移除MudSelect上的Validation属性配置,框架会自动触发对应属性的校验逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:27:05