MudBlazor:如何在EditForm中验证列表对象?
问题原因与解决方案
问题出在foreach循环中使用迭代变量绑定For表达式,导致Blazor的验证框架无法正确识别集合中每个元素的属性验证规则,进而跳过验证直接触发OnValidSubmit。
解决步骤
将foreach循环替换为for循环,通过索引绑定集合元素,确保验证框架能正确解析每个属性的验证规则:
@page "/ValidationTest" @inject IDialogService DialogService <EditForm Model="@Persons" OnValidSubmit="Send"> @for (int i = 0; i < Persons.Length; i++) { // 捕获当前索引,避免闭包问题 int index = i; <MudTextField @bind-Value="Persons[index].Name" For="@(() => Persons[index].Name)" /> } <MudIconButton ButtonType="ButtonType.Submit" Icon="@Icons.Material.Filled.Send" /> </EditForm> @code{ class Person { [System.ComponentModel.DataAnnotations.Required] public string Name { get; set; } = null!; } Person[] Persons = new Person[] { new Person(), new Person() }; void Send() { this.DialogService.ShowMessageBox("提示","验证通过!"); } }
原理说明
foreach中的迭代变量是循环共享的,For="@(()=>person.Name)"无法生成指向数组特定元素的属性路径,验证框架无法识别该属性的Required规则。for循环通过索引访问元素,结合捕获的index变量,For="@(() => Persons[index].Name)"能生成明确的属性路径(如Persons[0].Name),验证框架会正确应用每个元素的验证规则,为空时阻止表单提交。
内容的提问来源于stack exchange,提问作者Iori Kyo
相关产品推荐
相关产品推荐

