Привязка свойства DropdownList к методу контроллера в ASP.NET Core - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь получить раскрывающийся список, работающий над представлением создания для конкретного объекта модели. В данном случае рассматриваемой моделью является 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 моего контроллера, хотя он привязан к другим (текстовым) полям в представлении, я не могу понять, как заставить его заполнить свойство Division для объекта Department с помощью выбора из выпадающего списка. вниз. Мой метод создания ниже:

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

Идея состоит в том, что определенный отдел принадлежит (и связан с) к одному подразделению.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Напишите ваш 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 голосов
/ 03 сентября 2018

Вот простая демонстрация, вы можете попробовать ее

Добавьте ViewModel с IList в качестве свойства для элементов вашего выпадающего списка.

 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();

Измените метод Create, как показано ниже

public async Task<IActionResult> Create(DepartmentViewModel department)
    {
        //Add department
    }
...