ASP.NET Core MVC中按枚举顺序执行Switch Case且仅执行一次
问题解决:ASP.NET Core MVC中按顺序执行枚举case且仅执行一次
问题分析
你想要实现的核心是每个角色对应固定顺序的Stat操作,且每个角色只能执行一次对应初始操作,不能回溯执行更早的Stat,但你之前尝试在switch中嵌套if的写法是语法错误,C#不允许在switch块内直接用if逻辑包裹case标签。
解决方案思路
要实现这个需求,关键是通过数据库记录检查判断该角色是否已经执行过对应操作,再结合角色与Stat的对应关系做校验:
- 每个角色对应唯一的初始允许Stat(student→x,teacher→y,employee→z)
- 只有当该角色没有已存在的记录时,才能执行对应的初始Stat操作
- teacher的Stat.a直接返回错误提示,无需检查记录
完整代码实现
// 获取当前请求的角色和状态 var currentRole = table?.Type; var currentStat = table?.Stat; // 查询该角色是否已有操作记录 var existingRecord = _context.table.FirstOrDefault(t => t.Type == currentRole); // 处理逻辑 if (currentRole != null && currentStat != null) { switch ((currentRole.Value, currentStat.Value)) { case (Role.student, Stat.x): // 检查是否已有记录,确保仅执行一次 if (existingRecord == null) { var stat4 = new model() { Stat = VM.stat, Type = Role.student, FormId = form.Id }; _context.table.Add(stat4); await _context.SaveChangesAsync(); // 确保数据写入数据库 } else { TempData["error-message"] = "该角色已完成对应操作,无法重复执行"; } break; case (Role.teacher, Stat.y): if (existingRecord == null) { var stat4 = new model() { Stat = VM.stat, Type = Role.teacher, FormId = form.Id }; _context.table.Add(stat4); await _context.SaveChangesAsync(); } else { TempData["error-message"] = "教师已设置过y状态,无法再设置x"; } break; case (Role.employee, Stat.z): if (existingRecord == null) { var stat4 = new model() { Stat = VM.stat, Type = Role.employee, FormId = form.Id }; _context.table.Add(stat4); await _context.SaveChangesAsync(); } else { TempData["error-message"] = "该角色已完成对应操作,无法重复执行"; } break; case (Role.teacher, Stat.a): TempData["error-message"] = "error"; break; default: // 处理不符合顺序的请求,比如教师请求x、学生请求y等 TempData["error-message"] = "操作不符合允许的顺序"; break; } } return RedirectToAction("Index");
关键说明
- 记录检查:通过
FirstOrDefault查询数据库中该角色的已有记录,确保每个角色只能执行一次对应初始操作 - 顺序校验:每个case只处理角色对应的允许Stat,其他非法组合会进入default分支提示错误
- 语法修正:移除了原代码中switch内的非法if嵌套,改用标准switch-case结构结合外部记录检查
- 数据持久化:添加
SaveChangesAsync确保操作数据能正确写入数据库(原代码遗漏了这一步)
内容的提问来源于stack exchange,提问作者Csh
相关产品推荐
相关产品推荐

