You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:05:17