ASP.NET MVC 将数据从数据库检索到下拉列表
本文关键字:数据库 检索 下拉列表 数据 NET MVC ASP | 更新日期: 2023-09-27 17:56:05
我正在使用 ASP.NET MVC Core,Entity Framework Core和SQL Server。我在下面列出了以下型号和控制器。一切正常,我能够使用fine将数据从数据库检索到我的DropDownList控件。
我想知道是否有人可以帮助我是否有更好的方法来检索我现在在 EmployeeController 中的"公共 IActionResult Create()"中的数据?
如果可能的话,我想但不确定如何创建 2 个称为公共 IActionResult DeptData() 和 IActionResult BldgData() 的方法将数据检索到这些方法,然后将返回的数据传递给公共 IActionResult Create() 方法的员工控制器,而不是我现在拥有它的方式。
员工模式:
public class Employee
{
[Key]
public int EmpId { get; set; }
[Required]
public string EmpFirstName { get; set; }
[Required]
public string EmpLastName { get; set; }
public int DeptId { get; set; }
public Department Department { get; set; }
public int BldgId { get; set; }
public Building Building { get; set; }
}
员工控制:
public class EmployeeController : Controller
{
private DataEntryContext _context;
public EmployeeController(DataEntryContext context)
{
_context = context;
}
// GET: /<controller>/
public IActionResult Index()
{
return View(_context.Employees.ToList());
}
public string RetrieveDept()
{
var getDeptTitle = _context.Departments.ToList();
SelectList Deptlist = new SelectList(getDeptTitle, "DeptId", "DeptTitle");
ViewBag.DeptListName = Deptlist;
return View(Create);
}
public IActionResult Create()
{
var getDeptTitle = _context.Departments.ToList();
SelectList Deptlist = new SelectList(getDeptTitle, "DeptId", "DeptTitle");
ViewBag.DeptListName = Deptlist;
var getBldgTitle = _context.Buildings.ToList();
SelectList Bldglist = new SelectList(getBldgTitle, "BldgId", "BldgName");
ViewBag.BldgListName = Bldglist;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
_context.Employees.Add(employee);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
}
员工创建视图:
<form asp-controller="employee" asp-action="Create" method="post" class="form-horizontal" role="form">
<div class="form-horizontal">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="EmpFirstName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="EmpFirstName" class="form-control" />
<span asp-validation-for="EmpFirstName" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="EmpLastName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="EmpLastName" class="form-control" />
<span asp-validation-for="EmpLastName" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="DeptId" class="col-md-2 control-label"></label>
<div class="col-md-10">
<select asp-for="DeptId" asp-items="@ViewBag.DeptListName" class="form-control"></select>
<span asp-validation-for="DeptId" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="BldgId" class="col-md-2 control-label"></label>
<div class="col-md-10">
<select asp-for="BldgId" asp-items="@ViewBag.BldgListName" class="form-control"></select>
<span asp-validation-for="BldgId" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
您可以做的一件事是将代码包装起来,以获取下拉列表所需的项到可以从其他操作方法调用的单独方法。
public IActionResult Create()
{
ViewBag.DeptListName = GetDepartments();
// Do the same for your other dropdown also
return View();
}
private IEnumerable<SelectListItem> GetDepartments()
{
return context.Departments
.Select(s=> new SelectListItem {
Value=s.DeptId.ToString(),
Text=s.DeptTitle })
.ToList();
}
我个人更喜欢避免使用ViewBag和ViewData,并使用强类型视图模型将这些数据传递给视图。如果您有兴趣,这里有一篇文章解释了如何做到这一点。
我建议使用部分视图。它们中的每一个都有相关的下拉列表。
首先,我不建议使用 ViewBag,而是使用强类型视图。因此,您的主视图需要接受MasterCreateViewModel
并且您需要创建一个同时具有Buildings
和Departments
class MasterCreateViewModel
{
public List<Department> Departments { get; set; }
public List<Building> Buildings { get; set; }
}
您的主创建应使用此视图模型返回视图。
public IActionResult Create()
{
var getDeptTitle = _context.Departments.ToList();
var getBldgTitle = _context.Buildings.ToList();
var viewModel = new MasterCreateViewModel()
{
Departments = getDeptTitle,
Buildings = getBldgTitle
}
return View(viewModel);
}
然后,您需要两个操作来返回带有相关下拉列表的部分视图。 例如
public IActionResult CreateDepartmentsPartial(List<Department> departments)
{
return PartialView("CreateDepartmentsPartial", departments);
}
而且,部分观点也是如此:
<div class="form-group">
<label asp-for="DeptId" class="col-md-2 control-label"></label>
<div class="col-md-10">
<select asp-for="DeptId" asp-items="@Model" class="form-control"></select>
<span asp-validation-for="DeptId" class="text-danger"></span>
</div>
</div>
然后,您需要使用相关模型调用分部视图:
<div class="form-group">
<label asp-for="EmpLastName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="EmpLastName" class="form-control" />
<span asp-validation-for="EmpLastName" class="text-danger"></span>
</div>
</div>
@Html.RenderPartial("CreateDepartmentsPartial", Model.Departments)
PS:ASP.NET 核心也有异步部分渲染。