Заполнение DropDownList в ASP.NET MVC

Следующий код предназначен для создания пользователей. У меня есть класс пользователей, мне нужно создать здесь пользователей. Но у меня есть идентификатор отдела для человека, и этот идентификатор отдела относится к другой таблице в базе данных, имя которой - Department.

public ActionResult Create()
{
    // disable lazy because of error it creates
    _db.Configuration.LazyLoadingEnabled = false;
    var data = _db.Departments.OrderBy(a => a.DepartmentId).ToList();
    ViewData["DepartmentList"] = data;

    return View();
}

Вот вид:

@{
    var departmentLists = ViewData["DepartmentList"]; // Cast the list
}

<div class = "form-group">
     @Html.LabelFor(model => model.Department, htmlAttributes: new { @class = "control-label col-md-2" })
     <div class = "col-md-10">
          @Html.EnumDropDownListFor(model => model.Department, htmlAttributes: new { @class = "form-control" })
         @Html.ValidationMessageFor(model => model.Department, "", new { @class = "text-danger" })
     </div>
</div>

Эта часть модели. Отдела - это то место, где я потерял. Мне нужно указать свой отдел в порядке списка, когда пользователь выбирает, я хочу выбрать идентификатор отдела. Нравится;

Заполнение DropDownList в ASP.NET MVC

Итак, я хочу, чтобы пользователь увидел

Department Name + SubDepartment name

и когда они выбирают из списка, выбранная вещь

departmentid

так что я могу добавить это в базу данных.

Вот мой метод создания публикации:

public ActionResult Create([Bind(Include = "ID,LastName,FirstMidName,EnrollmentDate,Email,Department,Position,Active")] User user)
{
    if (ModelState.IsValid)
    {
        _db.Users.Add(user);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

     return View(user);
 }

Это мой класс User;

public class User
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int DepartmentId { get; set; }

    // Other fields removed for brevity
}

Вот класс Department;

public class Department
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DepartmentId { get; set; }

    public string DepartmentName { get; set; }

    public string SubDepartmentName { get; set; }
}

Это свойство Department имеет тип enum в классе viewmodel? Если вы хотите отображать составное текстовое значение, я думаю, вам следует попробовать DropDownListFor.

Tetsuya Yamamoto 17.12.2018 07:49

@TetsuyaYamamoto Я не уверен, что выбрать для отображения, поэтому тоже задаю этот вопрос.

Alper 17.12.2018 08:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Напишите свой метод GET для Create следующим образом:

public ActionResult Create()
{
    // disable lazy because of error it creates
    _db.Configuration.LazyLoadingEnabled = false;

    var departmentList = _db.Departments.Select(d => new
     {
        d.DepartmentId,
        DepartmentName = d.DepartmentName + " " + d.SubDepartmentName
     }).OrderBy(a => a.DepartmentId).ToList();

    ViewBag.DepartmentList = new SelectList(departmentList,"DepartmentId","DepartmentName");

    return View();
}

Тогда в представлении:

<div class = "form-group">
        @Html.LabelFor(model => model.DepartmentId, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class = "col-md-10">
            @Html.DropDownList("DepartmentId", ViewBag.DepartmentList as SelectList, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.DepartmentId, "", new { @class = "text-danger" })
        </div>
    </div>

Другая проблема в вашем методе CreatePOST. Вы не позволяете передавать DepartmentId в ваш список включения Bind. Обновите метод CreatePOST следующим образом:

public ActionResult Create([Bind(Include = "ID,LastName,FirstMidName,EnrollmentDate,Email,DepartmentId,Position,Active")] User user)
{
    if (ModelState.IsValid)
    {
       _db.Users.Add(user);
       _db.SaveChanges();
       return RedirectToAction("Index");
    }

    return View(user);
} 

Почти правда, просто мы не публикуем выбранный нами идентификатор отдела в базе данных.

Alper 17.12.2018 08:14

Пожалуйста, объясните проблему немного подробнее. Я исправлю!

TanvirArjel 17.12.2018 08:15

Отредактировал ваш ответ как рабочую версию и добавил класс пользователя на мой вопрос. Все в порядке, за исключением того, что база данных не получила 1 значение в качестве отправления, когда я создаю пользователя и публикую значение.

Alper 17.12.2018 08:17

Нет, извините, недоразумение произошло. По-прежнему публикация отъезда не работает. Отдых в порядке.

Alper 17.12.2018 08:19

Не могли бы вы дать мне удаленный доступ, пожалуйста!

TanvirArjel 17.12.2018 08:20

Я категорически не согласен с вашим использованием DropDownList, вместо этого используйте строго типизированную вспомогательную версию.

Tetsuya Yamamoto 17.12.2018 08:20

Когда я выбираю из раскрывающегося списка элемент 1, он должен опубликовать значение параметра depmentid до 1. Если я выберу пункт 2, он должен отправить отправление к значению 2 и т. д. И т. Д.

Alper 17.12.2018 08:22

@TetsuyaYamamoto Вы понятия не имеете о SelectList. Не обращайте внимания, пожалуйста! Здесь мы делимся знаниями. Select-list за кулисами реализует SelectListItem. Буду признателен, если снимете, пожалуйста, отрицательный голос! Спасибо.

TanvirArjel 17.12.2018 08:23

@Thatshowweroll Не могли бы вы добавить свой класс модели отдела в вопрос, пожалуйста!

TanvirArjel 17.12.2018 08:24

@TanvirArjel я сделал

Alper 17.12.2018 08:25

есть проблема! Обновляю свой ответ!

TanvirArjel 17.12.2018 08:26

Когда вы сказали, я нашел, и ваш ответ тоже правильный. Спасибо

Alper 17.12.2018 08:30

Приятно видеть, что ваша проблема решена! Добро пожаловать!

TanvirArjel 17.12.2018 08:30

Другие вопросы по теме