Попытка получить выпадающий список работает в ядре asp.net - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь заставить работать выпадающий список в ядре asp.net, но ему даже не нравится первый список, которым предполагается заполнить штатные сотрудники.У меня есть таблица с названием заголовка действия, с идентификатором персонала для внешней команды, связанным с таблицей персонала.

Сначала приведу код, который я пробую из этого урока

public IEnumerable<SelectListItem> GetStaff()
{
        List <SelectListItem> staff = _db.Staff.AsNoTracking();

            List <SelectListItem> selectListItems = _db.Staff.AsNoTracking()
                .OrderBy(n => n.FirstName)
                    .Select(n =>
                    new SelectListItem
                    {
                        Value = n.StaffID.ToString(),
                        Text = n.FirstName.ToString() + " " + n.LastName.ToString()
                    }).ToList();
            var stafftip = new SelectListItem()
            {
                Value = null,
                Text = "--- select staff memeber---"
            };
            staff.Insert(0, stafftip );
            return new SelectList(staff, "Value", "Text");

}

Мой класс для заголовка действия

 public class ActivityHeader
 { 
    // other fields removed for brevity

    [Required]        
    [Display(Name = "Staff")]
    public int StaffId { get; set; }
    public IEnumerable<Staff> Staff { get; set; }
 }

Мой класс персонала здесь, который должен связываться с другой таблицей с идентификатором персонала

public class Staff
{
    [Key]
    public int StaffID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
    public int DepartmentId { get; set; }

    public string StaffNumber { get; set; }
    public virtual IEnumerable<Staff> Staff { get; set; }
 }

Это мой HTML для моего представления, которое находится во всплывающем окне начальной загрузки.

<div class="col-sm-3">
     <label for="inputPostalCode">SOP</label>
   <div class="form-group">
     @Html.LabelFor(x => Model.Staff, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-5">
       @Html.DropDownListFor(x => Model.StaffId, new SelectList(Model.Staff, "Value", "Text"), htmlAttributes: new { @class = "form-control", id = "Country" })
     @Html.ValidationMessageFor(x => x.StaffId, "", new { @class = "text-danger" })
  </div>
 </div>
</div>

То, что я ожидаю увидеть, это выпадающий список html с результатами сотрудников, но связанный с руководителем действия с идентификатором персонала.

Но этот список почему-то не нравится.Точная ошибка

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я вижу, что в вашей реализации DropDownList есть несколько ошибок:

Номер №1:

Если вы хотите, чтобы ни один элемент не был выбран из DropDownListтогда значение null для списка выбора будет передано, тогда нет необходимости устанавливать DropDownList текст уровня следующим образом:

var stafftip = new SelectListItem()
{
            Value = null,
            Text = "--- select staff memeber---"
};
staff.Insert(0, stafftip );

Скорее просто ваш GetStaff() метод выглядит следующим образом:

public SelectList GetStaff()
{
     var staffList = _db.Staff.Select(s => new
     {
           Value = s.StaffID,
           Text = s.FirstName + " " + s.LastName
     }).ToList();

    return new SelectList(staffList, "Value", "Text");
}

Теперь в ваших модельных классах замените public virtual IEnumerable<Staff> Staff { get; set; } на public SelectList Staff { get; set; }

Затем в представлении:

@Html.DropDownListFor(x => Model.StaffId, Model.Staff,"Select Staff", htmlAttributes: new { @class = "form-control", id = "Country" })

Число # 2:

Если хотите, если из DropDownList не выбран ни один элемент, тогда будет передано значение default (0 or anything) для списка выбора, затем напишите свой метод GetStaff() следующим образом:

public IEnumerable<SelectListItem> GetStaff()
{
    List<SelectListItem> staffSelectListItems = _db.Staff.OrderBy(n => n.FirstName)
                                   .Select(n => new SelectListItem
                                   {
                                       Value = n.StaffID.ToString(),
                                          Text = n.FirstName.ToString() + " " + n.LastName.ToString()
                                   }).ToList();

    var defaultSelection = new SelectListItem()
    {
                Value = "0",
                Text = "Select Staff Member",
                Selected = true // <-- this is obligatory
    };
    staffSelectListItems.Insert(0, defaultSelection);
    return staffSelectListItems;
}

Затемв представлении:

@Html.DropDownListFor(x => Model.StaffId,(List<SelectListItem>)Model.Staff, htmlAttributes: new { @class = "form-control", id = "Country" })

Надеюсь, теперь это будет работать для вас!

0 голосов
/ 17 февраля 2019
public IEnumerable<SelectListItem> GetStaff()
{
    List <SelectListItem> selectListItems = _db.Staff.AsNoTracking()
         .OrderBy(n => n.FirstName)
         .Select(n =>
            new SelectListItem
                 {
                     Value = n.StaffID.ToString(),
                     Text = n.FirstName.ToString() + " " + n.LastName.ToString()
                 }).ToList();
    var stafftip = new SelectListItem()
       {
          Value = null,
          Text = "--- select staff memeber---"
       };

   selectListItems.Insert(0, stafftip );
   return new SelectList(selectListItems, "Value", "Text");        
}

Вы пытались присвоить IQueryable списку, который не собирался работать.Я удалил эту строку и исправил использование вами списка выбора, поскольку персонал не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...