Blazor组件中单选按钮值无法保存至Student类的问题
Blazor单选按钮值无法保存至模型的解决方案
针对InputRadioGroup的修复方案
你的第一种实现问题核心在于重复设置name属性以及可能的模型初始化缺失:
- 移除InputRadio上的
name属性,InputRadioGroup会自动管理子元素的name,重复设置会干扰Blazor的绑定逻辑 - 必须在组件中初始化Student实例,避免空引用导致绑定失效
- 确保Value类型与模型属性类型严格匹配(当前模型用string类型,所以字符串值"1""0"是匹配的)
修复后的代码:
<EditForm Model="@student" OnValidSubmit="@Submit" FormName="Students" id="studentsForm"> <InputRadioGroup @bind-Value="student.AlternanzaAziendale"> <div class="form-check form-check-inline"> <InputRadio Value="1" class="form-check-input" id="alternanzaAziendale1"/> <label class="form-check-label" for="alternanzaAziendale1">是</label> </div> <div class="form-check form-check-inline"> <InputRadio Value="0" class="form-check-input" id="alternanzaAziendale2" /> <label class="form-check-label" for="alternanzaAziendale2">否</label> </div> </InputRadioGroup> <button type="submit">提交</button> </EditForm> @code { private Student student = new Student(); // 必须初始化实例 private void Submit() { // 此处可正常获取student.AlternanzaAziendale的值 } public class Student { [Required(ErrorMessage = "Seleziona se hai fatto alternanza in azienda")] public string AlternanzaAziendale { get; set; } public string TempoEsteroFamiglia { get; set; } } }
针对原生radio按钮的修复方案
第二种实现中,直接用@onchange赋值未触发EditForm的模型状态更新,推荐改用Blazor双向绑定或手动触发状态变更:
方案1:使用双向绑定(最简单)
<EditForm Model="@student" OnValidSubmit="@Submit" FormName="Students" id="studentsForm"> <div class="right-side"> <div class="form-check form-check-inline"> <input @bind="student.TempoEsteroFamiglia" class="form-check-input" type="radio" name="TempoEsteroFamiglia" id="TempoEsteroFamigliaY" value="1"> <label class="form-check-label" for="TempoEsteroFamigliaY">是</label> </div> <div class="form-check form-check-inline"> <input @bind="student.TempoEsteroFamiglia" class="form-check-input" type="radio" name="TempoEsteroFamiglia" id="TempoEsteroFamigliaN" value="0"> <label class="form-check-label" for="TempoEsteroFamigliaN">否</label> </div> </div> <button type="submit">提交</button> </EditForm>
方案2:手动触发状态更新(若坚持用@onchange)
@implements IDisposable <EditForm Model="@student" OnValidSubmit="@Submit" FormName="Students" id="studentsForm"> <div class="right-side"> <div class="form-check form-check-inline"> <input @onchange="@(() => UpdateEsteroFamiglia("1"))" class="form-check-input" type="radio" name="TempoEsteroFamiglia" id="TempoEsteroFamigliaY"> </div> <div class="form-check form-check-inline"> <input @onchange="@(() => UpdateEsteroFamiglia("0"))" class="form-check-input" type="radio" name="TempoEsteroFamiglia" id="TempoEsteroFamigliaN"> </div> </div> </EditForm> @code { private Student student = new Student(); private EditContext? _editContext; protected override void OnInitialized() { _editContext = new EditContext(student); base.OnInitialized(); } private void UpdateEsteroFamiglia(string value) { student.TempoEsteroFamiglia = value; _editContext?.NotifyFieldChanged(FieldIdentifier.Create(() => student.TempoEsteroFamiglia)); } private void Submit() { // 处理提交逻辑 } public void Dispose() { // 清理资源 } }
额外排查点
- 暂时移除Blazor Bootstrap引用,测试原生Blazor组件是否正常,排查组件冲突问题
- 检查浏览器控制台是否存在JS错误,确认Blazor绑定脚本正常加载
- 确认.NET 8渲染模式(Server/WebAssembly)无特殊配置影响绑定逻辑
内容的提问来源于stack exchange,提问作者lorenzoboiko
相关产品推荐
相关产品推荐

