簡體   English   中英

將DropdownList屬性綁定到ASP.NET Core中的控制器方法

[英]Binding DropdownList property to controller method in ASP.NET Core

我試圖讓下拉列表在特定模型對象的創建視圖上工作。 在這種情況下,所討論的模型是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>

在控制器中,檢索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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM