Blazor中MudBlazor隐藏/非绑定字段自定义验证不触发如何解决
问题原因
- 第一类(Autocomplete 内置验证)未触发:MudAutocomplete 的
Validation属性仅针对组件自身绑定的Value生效,你当前没有为 Autocomplete 配置@bind-Value双向绑定,且你定义的验证函数入参为string类型,与 Autocomplete 指定的泛型T="Book"类型不匹配,因此验证逻辑完全不会被调用。 - 第二类(自定义数据注解验证)未触发:MudForm 默认只会校验绑定了
For表达式、且关联了 Form 绑定 Model 的字段。你虽然用 MudField 绑定了 Books,但没有给 MudForm 指定Model参数,也没有给 MudField 配置For表达式指向 Books 属性,MudForm 完全感知不到这个带验证特性的字段存在,因此不会触发对应校验逻辑。
解决方法
1. 修正基础配置,让数据注解验证生效
首先给 MudForm 绑定当前组件为 Model,同时修改 MudField 配置,指定 For 表达式关联 Books 属性:
<!-- 给MudForm加Model属性,绑定当前组件实例 --> <MudForm @ref="form" @bind-IsValid="@success" @bind-Errors="@errors" Model="@this"> <MudAutocomplete T="Book" Label="Select Book(s)" ValueChanged="@(b => AppendBookToList(b))" SearchFunc="@SearchBooks" MinCharacters="4" ToStringFunc="@(b => b == null ? null : $"{b.Name + " by " + b.Author}")" > </MudAutocomplete> @foreach (var b in Books) { <MudChip Color="Color.Primary" OnClose="@RemoveBook" Text="@b.Id.ToString()">@b.Name by @b.Author</MudChip> } <!-- 删掉@bind-Value,只保留For表达式指向Books属性 --> <MudField For="@(() => Books)" /> <!-- 可选:加验证消息组件显示错误提示 --> <MudValidationMessage For="@(() => Books)" Class="text-error" /> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto" OnClick="@(() => form.Validate())">Submit</MudButton> </MudForm>
然后在 @code 块中初始化 Books 集合,避免空引用问题:
// 初始化空集合,避免校验时报空引用 [BooksValidation(ErrorMessage = "At least one Book required.")] public List<Book> Books { get; set; } = new();
此时点击提交按钮,自定义的 BooksValidationAttribute 就会正常触发,断点可以命中。
2. 可选:优化交互体验
如果需要用户选中图书后实时更新验证状态,可以在 AppendBookToList 和删除图书的方法末尾手动调用一次表单验证:
private void AppendBookToList(Book book) { if(book == null || Books.Any(b => b.Id == book.Id)) return; Books.Add(book); // 手动触发验证,实时更新校验状态 form.Validate(); } // 删书的时候也要同步更新验证状态 private void RemoveBook(MudChip chip) { var bookId = int.Parse(chip.Text); Books.RemoveAll(b => b.Id == bookId); form.Validate(); }
内容的提问来源于stack exchange,提问作者LOL. NO.
相关产品推荐
相关产品推荐

