ASP.NET Core中如何根据当前工作流状态动态调整Select下拉框可选选项
ASP.NET Core 3.1 MVC 工作流动态下拉框实现方案
1. 定义状态枚举与合法跳转规则
首先将工作流状态定义为枚举,同时用静态字典存储状态间的合法跳转映射,后续调整规则只需修改字典配置即可:
// 工作流状态枚举 public enum WorkflowStatus { Open, Scheduled, Closed } // 状态跳转规则配置 public static class WorkflowTransitionRules { public static readonly IReadOnlyDictionary<WorkflowStatus, IEnumerable<WorkflowStatus>> AllowedTransitions = new Dictionary<WorkflowStatus, IEnumerable<WorkflowStatus>> { // 可根据业务需求调整各状态允许跳转的目标 [WorkflowStatus.Open] = new[] { WorkflowStatus.Scheduled, WorkflowStatus.Closed }, [WorkflowStatus.Scheduled] = new[] { WorkflowStatus.Closed }, [WorkflowStatus.Closed] = new[] { WorkflowStatus.Open } }; }
如果需要状态显示为中文,只需在枚举字段上加
[Display(Name = "已开启")]特性,构造下拉选项时读取特性值即可。
2. 控制器层构造动态下拉选项
在返回编辑页的Action中,先读取当前工作流的存储状态,再根据跳转规则生成可选选项,推荐通过强类型ViewModel传递数据,也可临时用ViewBag传递:
public class WorkflowEditViewModel { public int Id { get; set; } public WorkflowStatus CurrentStatus { get; set; } public WorkflowStatus NewStatus { get; set; } public List<SelectListItem> AllowedStatusOptions { get; set; } } public IActionResult Edit(int workflowId) { // 从数据库读取当前工作流实体 var workflow = _context.Workflows.Find(workflowId); var currentStatus = workflow.Status; // 读取当前状态允许跳转的目标列表,增加判空避免未定义状态报错 if (!WorkflowTransitionRules.AllowedTransitions.TryGetValue(currentStatus, out var allowedStatuses)) { allowedStatuses = Enumerable.Empty<WorkflowStatus>(); } // 构造下拉选项,如需默认展示禁用的当前状态,可额外添加一个禁用的SelectListItem var viewModel = new WorkflowEditViewModel { Id = workflow.Id, CurrentStatus = currentStatus, AllowedStatusOptions = allowedStatuses.Select(s => new SelectListItem { Text = s.ToString(), Value = ((int)s).ToString() }).ToList() }; return View(viewModel); }
3. 视图层绑定下拉框
直接通过TagHelper绑定动态生成的选项列表即可:
@model WorkflowEditViewModel <div class="form-group"> <label>工作流状态</label> <p class="text-muted">当前状态:@Model.CurrentStatus.ToString()</p> <select asp-for="NewStatus" asp-items="Model.AllowedStatusOptions" class="form-control"></select> <span asp-validation-for="NewStatus" class="text-danger"></span> </div>
4. 后端增加跳转规则校验
前端限制仅用于优化交互,必须在后端提交时二次校验,防止恶意请求绕过前端限制:
[HttpPost] public IActionResult Edit(WorkflowEditViewModel viewModel) { var workflow = _context.Workflows.Find(viewModel.Id); var currentStatus = workflow.Status; // 校验提交的状态是否符合跳转规则 if (!WorkflowTransitionRules.AllowedTransitions[currentStatus].Contains(viewModel.NewStatus)) { ModelState.AddModelError(nameof(viewModel.NewStatus), "不允许修改为该状态"); // 重新构造选项返回视图 viewModel.AllowedStatusOptions = WorkflowTransitionRules.AllowedTransitions[currentStatus] .Select(s => new SelectListItem { Text = s.ToString(), Value = ((int)s).ToString() }).ToList(); return View(viewModel); } // 校验通过后更新状态 workflow.Status = viewModel.NewStatus; _context.SaveChanges(); return RedirectToAction(nameof(Index)); }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

