如何在Razor组件切换角色时保留权限下拉框的选中值?
解决方案
要实现切换回Admin角色时保留之前选中的Read权限,核心是缓存每个角色对应的最后选择权限,而非每次切换角色都强制设置固定默认值。具体修改如下:
关键修改点
- 添加字典存储各角色的历史选中权限ID
- 修改权限绑定逻辑,用户切换权限时同步更新对应角色的缓存
- 切换角色时优先读取缓存中的权限值,无缓存时再使用默认值
修改后的完整代码
@using System.Collections <h3>User</h3> <div> <label>Role:</label> <select @bind="SelectedRoleId"> @foreach (var role in Roles) { <option value="@role.Id">@role.Name</option> } </select> </div> <div> <label>Permission:</label> <select @bind="selectedPermissionId"> @foreach (var permission in Permissions) { <option value="@permission.Id">@permission.Name</option> } </select> </div> @code { // 缓存各角色对应的最后选中权限ID private Dictionary<int, int> _rolePermissionCache = new(); private int _selectedPermissionId; private int _selectedRoleId; private List<Role> Roles { get; set; } private List<Permission> Permissions { get; set; } private int selectedPermissionId { get => _selectedPermissionId; set { _selectedPermissionId = value; // 已选中角色时,更新对应角色的权限缓存 if (_selectedRoleId != 0) { _rolePermissionCache[_selectedRoleId] = value; } } } private int SelectedRoleId { get => _selectedRoleId; set { _selectedRoleId = value; switch (_selectedRoleId) { case 1: Permissions = new List<Permission> { new () { Id = 1, Name = "Write" }, new () { Id = 2, Name = "Read" } }; // 优先读取缓存,无缓存时用默认值Write selectedPermissionId = _rolePermissionCache.TryGetValue(1, out var adminPerm) ? adminPerm : 1; break; case 2: Permissions = new List<Permission> { new() { Id = 2, Name = "Read" } }; // User角色仅有权限Read,取缓存或默认值 selectedPermissionId = _rolePermissionCache.TryGetValue(2, out var userPerm) ? userPerm : 2; break; } } } protected override void OnInitialized() { Roles = new List<Role> { new() { Id = 1, Name = "Admin" }, new() { Id = 2, Name = "User" } }; SelectedRoleId = 1; } public class Role { public int Id { get; set; } public string Name { get; set; } } public class Permission { public int Id { get; set; } public string Name { get; set; } } }
逻辑说明
- 用户在Admin角色下切换权限为Read时,该选择会存入
_rolePermissionCache(键为角色ID=1,值为权限ID=2) - 切换到User角色时,自动选中Read并缓存该选择
- 切回Admin角色时,优先读取缓存中保存的权限ID=2,自动选中Read,而非强制重置为Write
内容的提问来源于stack exchange,提问作者Adam Shakhabov
相关产品推荐
相关产品推荐

