MVC Razor中为首个radio输入项设置checked属性不生效问题
失效原因
原写法不生效核心是两点:
checked是HTML布尔属性,只要标签上带这个属性,不管值写什么,浏览器都会认为单选项是选中状态,你用三元表达式返回空字符串的写法,没法让Razor正确控制这个属性的存在/移除- 你用了
asp-for="SelectedAddress"标签助手,标签助手会优先根据绑定的SelectedAddress字段值来设置选中状态,手动拼接的checked属性会被标签助手的默认渲染逻辑覆盖
可用实现方案
方案1:通过绑定值自动设置选中(推荐)
这是最符合ASP.NET Core MVC绑定逻辑的写法,完全不需要手动维护firstItem变量,也不用拼接checked属性,标签助手会自动完成选中状态渲染,后续表单提交也不会出现选中值和绑定字段不一致的问题:
@{ // 页面初始化时如果没有预设选中地址,默认选中第一个地址 if (Model.userAddresses != null && Model.userAddresses.Any() && Model.SelectedAddress == default) { Model.SelectedAddress = Model.userAddresses.First().Id; } } @foreach (var item in Model.userAddresses) { <div> <div class="d-lg-inline-block"> <input asp-for="SelectedAddress" type="radio" value="@item.Id" /> @item.FullAddress<br /> </div> </div> }
方案2:手动条件渲染checked属性
如果不想修改绑定字段值,可以直接通过Razor条件块输出完整checked属性,只有条件成立时才会把属性加到标签上,不会出现空属性占位的问题:
@{ bool firstItem = true; } @foreach (var item in Model.userAddresses) { <div> <div class="d-lg-inline-block"> <input asp-for="SelectedAddress" type="radio" value="@item.Id" @if(firstItem){ <text>checked="checked"</text> } /> @item.FullAddress<br /> </div> </div> firstItem = false; }
内容的提问来源于stack exchange,提问作者nnmmss
相关产品推荐
相关产品推荐

