如何在C#中根据Admin权限控制ChangeStatus下拉列表选项?
实现权限控制下拉列表选项的方案
当然可以实现这个需求!咱们完全可以基于你现有的权限校验体系来调整ChangeStatus页面的下拉列表选项逻辑,具体实现步骤如下:
1. 在控制器方法中加入权限判断逻辑
在你的ChangeStatus控制器方法里,生成ViewBag.statusList的时候,结合当前订单状态和用户Admin权限来过滤选项:
public IActionResult ChangeStatus(int disposalOrderId) { // 获取目标订单 var disposalOrder = _disposalOrderService.GetById(disposalOrderId); // 1. 判断当前用户是否拥有Admin权限(复用你现有的IGT.canAccess校验) bool hasAdminAccess = IGT.canAccess(AccessRestrictions.Admin); // 2. 生成基础状态选项列表(你原本的逻辑) var allStatusOptions = new List<SelectListItem> { new SelectListItem { Text = "待处理", Value = DOStatus.Pending.ToString() }, new SelectListItem { Text = "处置中", Value = DOStatus.InProgress.ToString() }, new SelectListItem { Text = "已处置", Value = DOStatus.Disposed.ToString() } // 其他状态选项... }; // 3. 根据权限和订单状态过滤选项 if (disposalOrder.Status == DOStatus.Disposed && !hasAdminAccess) { // 非Admin用户+订单已处置:仅保留"已处置"选项 ViewBag.statusList = allStatusOptions.Where(opt => opt.Value == DOStatus.Disposed.ToString()).ToList(); } else { // Admin用户 或 订单未处置:显示全部选项 ViewBag.statusList = allStatusOptions; } return View(disposalOrder); }
2. 封装逻辑提升复用性(可选)
如果多个地方都需要类似的权限过滤逻辑,建议把这个判断封装到Config模型中,让代码更整洁:
// 在Config模型中添加静态方法 public static List<SelectListItem> GetAllowedStatusOptions(DOStatus currentOrderStatus, bool isAdmin) { var allOptions = new List<SelectListItem> { // 基础选项定义... }; if (currentOrderStatus == DOStatus.Disposed && !isAdmin) { return allOptions.Where(opt => opt.Value == DOStatus.Disposed.ToString()).ToList(); } return allOptions; }
然后在控制器里直接调用:
bool hasAdminAccess = IGT.canAccess(AccessRestrictions.Admin); ViewBag.statusList = Config.GetAllowedStatusOptions(disposalOrder.Status, hasAdminAccess);
3. 确保权限校验的一致性
因为你已经通过RestrictAccessAttribute和IGT.canAccess实现了全局权限校验,这里的判断逻辑和现有体系完全对齐,不会出现权限不一致的问题。同时LdapAuthentication完成认证后,用户的权限信息已经加载到userAccess中,IGT.canAccess可以正确返回校验结果。
这个方案不需要引入新的组件,完全依托你现有的代码结构,改动小且逻辑清晰。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

