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

如何在Razor组件切换角色时保留权限下拉框的选中值?

解决方案

要实现切换回Admin角色时保留之前选中的Read权限,核心是缓存每个角色对应的最后选择权限,而非每次切换角色都强制设置固定默认值。具体修改如下:

关键修改点

  1. 添加字典存储各角色的历史选中权限ID
  2. 修改权限绑定逻辑,用户切换权限时同步更新对应角色的缓存
  3. 切换角色时优先读取缓存中的权限值,无缓存时再使用默认值

修改后的完整代码

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:58:12