将 DropdownList 属性 绑定到 ASP.NET 核心中的控制器方法
Binding DropdownList property to controller method in ASP.NET Core
我正在尝试让下拉菜单处理特定模型对象的创建视图。在这种情况下,所讨论的模型是 Department,在该对象中,还有另一个引用的模型对象 Division。
我的 Department 模型是一个相当基本的 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>
是的,在 returns 视图的创建方法中,我正在填充 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; }
}
想法是特定部门属于(并关联)一个部门。
谢谢!
这里有一个简单的demo,你可以试一下
为您的下拉列表项添加一个带有 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();
像下面这样更改创建方法
public async Task<IActionResult> Create(DepartmentViewModel department)
{
//Add department
}
写下你的Department
class如下:
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>
我正在尝试让下拉菜单处理特定模型对象的创建视图。在这种情况下,所讨论的模型是 Department,在该对象中,还有另一个引用的模型对象 Division。
我的 Department 模型是一个相当基本的 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>
是的,在 returns 视图的创建方法中,我正在填充 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; }
}
想法是特定部门属于(并关联)一个部门。
谢谢!
这里有一个简单的demo,你可以试一下
为您的下拉列表项添加一个带有 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();
像下面这样更改创建方法
public async Task<IActionResult> Create(DepartmentViewModel department)
{
//Add department
}
写下你的Department
class如下:
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>