MVC中ProjectRole创建页外键PersonId、ProjectId下拉框无内容问题
问题原因
视图的PersonId、ProjectId下拉框绑定了ViewBag.PersonId、ViewBag.ProjectId作为数据源,但你控制器的GET请求Create方法没有对这两个ViewBag赋值,因此下拉框没有可选项。
解决步骤
1. 修改GET请求的Create方法
从数据库查询已有的人员、项目数据,转换为下拉列表需要的格式存入ViewBag:
// 若代码提示SelectListItem不存在,在控制器顶部添加此引用 using Microsoft.AspNetCore.Mvc.Rendering; public IActionResult Create() { // 构造人员下拉选项:值存人员ID,显示内容为人员全名 ViewBag.PersonId = _context.People .Select(p => new SelectListItem { Value = p.Id.ToString(), Text = $"{p.FirstName} {p.MiddleName} {p.LastName}" }) .ToList(); // 构造项目下拉选项:值存项目ID,显示内容为项目名称 ViewBag.ProjectId = _context.Projects .Select(p => new SelectListItem { Value = p.Id.ToString(), Text = p.Name }) .ToList(); return View(); }
2. 补充POST请求Create方法的ViewBag赋值
表单提交验证失败返回页面时,需要重新给ViewBag赋值,同时保留用户之前的选择,避免返回页面后下拉框再次为空:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,HourlyRate,PersonId,ProjectId,RoleId")] ProjectRole projectRole) { if (ModelState.IsValid) { _context.Add(projectRole); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } // 验证失败时重新赋值下拉选项,保留用户已选值 ViewBag.PersonId = _context.People .Select(p => new SelectListItem { Value = p.Id.ToString(), Text = $"{p.FirstName} {p.MiddleName} {p.LastName}", Selected = p.Id == projectRole.PersonId }) .ToList(); ViewBag.ProjectId = _context.Projects .Select(p => new SelectListItem { Value = p.Id.ToString(), Text = p.Name, Selected = p.Id == projectRole.ProjectId }) .ToList(); return View(projectRole); }
可选优化
如果RoleId对应有角色字典表,也可以参照上述逻辑把RoleId的输入框改为下拉选择,避免手动输入出错。
内容的提问来源于stack exchange,提问作者mrnewguy1998
相关产品推荐
相关产品推荐

