将 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
    }

写下你的Departmentclass如下:

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>