ASP.NET Core Razor Pages动态复选框选中状态不显示问题
问题分析与修复方案
核心问题1:页面加载时未绑定数据库中的选中状态
你在OnGetAsync方法构建CustomersChecked列表时,仅赋值了Text和Value,未将数据库AccessRights表的isSelected字段值绑定到SelectListItem的Selected属性,导致页面加载时无法正确显示已选中的复选框。
修复后的OnGetAsync代码:
public async Task<IActionResult> OnGetAsync(int? id) { if (id == null || _context.AccessRights == null) { return NotFound(); } var accessrightsList = await _context.AccessRights.Where(m => m.EmployeeId == id).ToListAsync(); AccessRights = accessrightsList.FirstOrDefault(); CustomersChecked = accessrightsList.Select(p => new SelectListItem { Text = p.CustomerName, Value = p.CustomerId.ToString(), Selected = p.isSelected // 新增:绑定数据库中的选中状态 }).ToList(); return Page(); }
核心问题2:HTML复选框checked属性写法错误
HTML中checked是布尔属性,只要属性存在,无论值是什么,浏览器都会判定为选中。你当前写法checked="@customers.Selected"会在未选中时输出checked="false",这依然会被浏览器视为选中状态,导致显示异常。
修复后的视图代码:
<div class="form-group"> <label class="control-label"> Access To Customers</label> <div class="checkbox checkboxlist"> @{ foreach (var customers in Model.CustomersChecked) { <input type="checkbox" id="@customers.Value" value="@customers.Value" name="CustomersChecked" @(customers.Selected ? "checked" : "") /> <label class="text-black">@customers.Text</label><br/> } } </div> <span class="text-danger"></span> </div>
额外优化:Post方法使用更可靠的更新条件
当前用CustomerName作为更新条件,若存在同名客户会导致错误更新,建议改用唯一标识CustomerId:
修复后的OnPostAsync中SQL语句部分:
await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE [AccessRights] SET [isSelected] = {item.Selected}, [LastModifiedBy] = {AccessRights.LastModifiedBy}, [LastModifiedTimeStamp] = {AccessRights.LastModifiedTimeStamp} WHERE [EmployeeId] = {AccessRights.EmployeeId} AND [CustomerId] = {item.Value}");
内容的提问来源于stack exchange,提问作者Teena
相关产品推荐
相关产品推荐

