将DropdownList属性绑定到ASP.NET Core中的控制器方法

问题描述 投票:0回答:2

我正在尝试获取特定模型对象的创建视图的下拉列表。在这种情况下,所讨论的模型是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; }
}

这个想法是一个特定的部门属于(并与之相关)一个部门。

谢谢!

c# asp.net-core-mvc dropdownlistfor
2个回答
1
投票

写下你的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>

0
投票

这是一个简单的演示,你可以尝试一下

添加一个带有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
    }
© www.soinside.com 2019 - 2024. All rights reserved.