Blazor单选按钮组异常:切换True需两次操作
Blazor单选按钮组UI更新异常问题排查与修复
你遇到的问题核心是手动绑定checked属性的方式和Blazor的状态更新机制冲突:当点击True选项时,浏览器先将该单选按钮标记为选中,但此时checked="@signatoryRequest.IsExternal"绑定的是旧值(False),Blazor状态更新时会根据旧值重新渲染UI,把刚选中的True按钮改回未选中;直到第二次点击时,IsExternal已经是True,渲染才会匹配正确状态。而切换回False时,初始值就是False,!@signatoryRequest.IsExternal为True,渲染不会冲突,所以功能正常。
方案1:使用Blazor双向绑定(推荐)
直接用@bind绑定单选按钮的value和布尔属性,Blazor会自动处理状态同步,无需手动写checked和onchange:
<div class="btn-group" role="group" aria-label="Basic radio toggle button group"> <input type="radio" class="btn-check" name="btnExternal" id="btnExternalTrue" autocomplete="off" @bind="signatoryRequest.IsExternal" value="true" /> <label class="btn btn-outline-primary" for="btnExternalTrue">True</label> <input type="radio" class="btn-check" name="btnExternal" id="btnExternalFalse" autocomplete="off" @bind="signatoryRequest.IsExternal" value="false" /> <label class="btn btn-outline-primary" for="btnExternalFalse">False</label> </div>
注意:这里的value要写字符串形式的"true"和"false",Blazor会自动转换为布尔值。
方案2:保留自定义方法的修复
如果必须保留ChangeIsExternal方法做额外逻辑,需要调整事件绑定并确保状态同步逻辑正确:
<div class="btn-group" role="group" aria-label="Basic radio toggle button group"> <input type="radio" class="btn-check" name="btnExternal" id="btnExternalTrue" autocomplete="off" checked="@(signatoryRequest.IsExternal)" @onclick="() => ChangeIsExternal(true)" /> <label class="btn btn-outline-primary" for="btnExternalTrue">True</label> <input type="radio" class="btn-check" name="btnExternal" id="btnExternalFalse" autocomplete="off" checked="@(!signatoryRequest.IsExternal)" @onclick="() => ChangeIsExternal(false)" /> <label class="btn btn-outline-primary" for="btnExternalFalse">False</label> </div> @code { private void ChangeIsExternal(bool value) { signatoryRequest.IsExternal = value; // 正常情况下Blazor会自动触发状态更新,非必要无需手动调用StateHasChanged() } }
将@onchange改为@onclick,确保先更新IsExternal的值,再让Blazor渲染正确的选中状态,避免浏览器的状态修改和Blazor的渲染逻辑冲突。
内容的提问来源于stack exchange,提问作者Chatra
相关产品推荐
相关产品推荐

