在 ASP.NET Core MVC 中仅执行一次 switch case,并保持 C# 中枚举的顺序

问题描述 投票:0回答:1

我有这个枚举:

public enum Stat
{
    x,
    y,
    z,
    a,   
}

我正在使用另一个枚举来表示角色:

public enum Role
{
    [Display(Name = "student")]
    student,
    [Display(Name = "teacher")]
    teacher,    
    [Display(Name = "employee")]
    employee,
}

在我的控制器中,我有以下代码:

switch (table?.Type, table?.Stat)
{
    case (Role.student, Stat.x):
    case (Role.teacher, Stat.y):
    case (Role.employee, Stat.z):
        var stat4 = new model()
                        {
                            Stat = VM.stat,
                            Type = Role.student,
                            FormId = form.Id
                        };
        _context.table.Add(stat4);
        break;

    case (Role.teacher, Stat.a):
        TempData["error-message"] = Message = "error";
        break;                          

    return RedirectToAction("Index");
}

在我的控制器中的 edit

POST
方法中,我想执行每个案例一次,并且顺序必须是(x,y,z,a),所以当老师设置 y 时,他不能再设置 x 并继续。

我正在努力让 switch 语句 case 仅在其不起作用时执行,并且是 ASP.NET Core MVC 世界的新手,有人可以帮助我吗?

bool caseExecuted = false;

switch (table?.Type, table?.Stat)
{
    if (!caseExecuted)
    {
       caseExecuted = true;

       case (Role.student, Stat.x):
       case (Role.teacher, Stat.y):
       case (Role.employee, Stat.z):
           var stat4 = new model()
                           {
                               Stat = VM.stat,
                               Type = Role.student,
                               FormId = form.Id
                           };
           _context.table.Add(stat4);
           break;

       case (Role.teacher, Stat.a):
           TempData["error-message"] = Message = "error";
           break;                           

       return RedirectToAction("Index");
    }
}

我尝试这样做,但无论多少次它都会执行

c# asp.net-core asp.net-core-mvc switch-statement
1个回答
0
投票

感谢@XiangWeiHuang,它成功了! 这个想法是将枚举与 int 进行比较,我之前没有想到这一点。

所以如果将来有人需要的话,这就是答案


switch (table?.Type, (int)table?.Stat)
{
    case (Role.student, (int)Stat.x):
    case (Role.teacher, (int)Stat.y):
    case (Role.employee, (int)Stat.z):
        if ((int)VM.stat < (int?)table?.Stat)
        {
            var stat4 = new model()
            {
                Stat = VM.stat,
                Type = Role.student,
                FormId = form.Id
            };
            _context.table.Add(stat4);
        }
        else
        {
            TempData["error-message"] = Message = "you can't change back status");
            return RedirectToAction("Index");
        }
        break;
    case (Role.teacher, Stat.a):
        TempData["error-message"] = Message = "error";
        return RedirectToAction("Index");
}
© www.soinside.com 2019 - 2024. All rights reserved.