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

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");

关键说明

  1. 记录检查:通过FirstOrDefault查询数据库中该角色的已有记录,确保每个角色只能执行一次对应初始操作
  2. 顺序校验:每个case只处理角色对应的允许Stat,其他非法组合会进入default分支提示错误
  3. 语法修正:移除了原代码中switch内的非法if嵌套,改用标准switch-case结构结合外部记录检查
  4. 数据持久化:添加SaveChangesAsync确保操作数据能正确写入数据库(原代码遗漏了这一步)

内容的提问来源于stack exchange,提问作者Csh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:06:01