我正在尝试获取特定模型对象的创建视图的下拉列表。在这种情况下,所讨论的模型是Department,并且在该对象内,还有另一个被称为Division的模型对象。
我的部门模型是一个相当基本的POCO,除了名为Division的属性引用了另一个POCO(请注意,大部分只有Id字段和Name字段)。
我已经有了一个创建视图的工作下拉列表(参见下面的代码)
<div class="form-group">
<label asp-for="Division" class="control-label"></label>
@Html.DropDownListFor(dept => dept.Division, new SelectList(ViewBag.Divisions, "Id", "Name"))
</div>
是的,在返回视图的Create方法中,我正在填充ViewBag.Divisions列表,并且这些都按计划运行。
但是,在我的控制器的Create方法中,当它绑定到视图上的其他(文本)字段时,我无法弄清楚如何使用下拉列表中的选择来填充Department对象的Division属性。我的创建方法如下:
public async Task<IActionResult> Create([Bind("Id,Name,Description,IsActive,Division")] Department department)
{
if (ModelState.IsValid)
{
_context.Add(department);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(department);
}
另外,这是我的模型类:
public class Division
{
[Key]
public int Id { get; set; }
[Required]
[Display(Name = "Division Name")]
public string Name { get; set; }
[Display(Name = "Active")]
public bool IsActive { get; set; }
}
public class Department
{
[Key]
public int Id { get; set; }
[Required]
[Display(Name = "Department Name")]
public string Name { get; set; }
public string Description { get; set; }
public Division Division { get; set; }
[Display(Name = "Active")]
public bool IsActive { get; set; }
}
这个想法是一个特定的部门属于(并与之相关)一个部门。
谢谢!
写下你的Department
课程如下:
public class Department
{
[Key]
public int Id { get; set; }
[ForeignKey("Division")]
public int DivisionId {get; set;}
[Required]
[Display(Name = "Department Name")]
public string Name { get; set; }
public string Description { get; set; }
[Display(Name = "Active")]
public bool IsActive { get; set; }
public Division Division { get; set; }
}
然后在控制器方法中:
public async Task<IActionResult> Create([Bind("Id,Name,Description,IsActive,DivisionId")] Department department)
{
if (ModelState.IsValid)
{
_context.Add(department);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(department);
}
然后在视图中:
<div class="form-group">
<label asp-for="Division" class="control-label"></label>
@Html.DropDownListFor(dept => dept.DivisionId, new SelectList(ViewBag.Divisions, "Id", "Name"))
</div>
这是一个简单的演示,你可以尝试一下
添加一个带有IList的ViewModel作为下拉列表项的属性。
public class DepartmentViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public IList<int> Divisions { get; set; }
}
Create.cshtml中的代码
@model BindDropDownList.Models.DepartmentViewModel
<div class="form-group">
<label asp-for="@Model.Divisions" class="control-label"></label>
@Html.DropDownListFor(depart=>depart.Divisions , (List<SelectListItem>)ViewBag.Divisions)
</div>
在Controller中,检索ViewBag.Divisions
ViewBag.Divisions = _context.Division.Select(d => new SelectListItem { Value=d.Id.ToString(),Text=d.Name}).ToList();
像下面一样更改Create方法
public async Task<IActionResult> Create(DepartmentViewModel department)
{
//Add department
}