为何搭配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自动校验能力,无需自定义校验委托:
- 为
MudForm指定Model="@Model"和Validator="@validator"属性 - 移除
MudSelect上的Validation属性配置,框架会自动触发对应属性的校验逻辑
内容的提问来源于stack exchange,提问作者fbf
相关产品推荐
相关产品推荐

