.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
相关产品推荐
相关产品推荐

