ASP.NET Core 2.1 Раскрывающийся список пуст - PullRequest
0 голосов
/ 30 октября 2018

У меня есть этот выпадающий список, который должен содержать список элементов, т.е.

  1. Debug
  2. Информация
  3. Внимание
  4. Опасность

Вот так я получаю список

public IEnumerable<string> GetLogLevels()
{
    var data = dbContext.EventLogs.Distinct().ToList();
    var modifiedData = data.Select(u => u.Level);
    return modifiedData;
}

Это мой контроллер и модель представления

public IActionResult Index()
{
    var levels = new SelectList(logsData.GetLogLevels(),"Level","Level");
    var llvm = new LevelsListViewModel
    {
        Levels = levels
    };
    return View(llvm);
}

public class LevelsListViewModel
{
    public SelectList Levels { get; set; }
}

Вот как я это заявляю, на мой взгляд

var level = "<div class='col-sm-3 search-spacing'><label for='Level'>Level</label><select asp-for='Level' asp-items='@Model.Levels'></select></div>";

Проблема сейчас в том, что по какой-то причине он загружает пустой список. Когда я отлаживаю контроллер, я вижу свои значения.

В sidenote, это правильный способ получения одного поля и заполнения списка? Я хочу только отдельное значение.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Эта строка вызывает проблему, потому что метод GetLogLevels() возвращает IEnumerable<string>, у которого нет свойства с именем Level в его контексте:

var levels = new SelectList(logsData.GetLogLevels(),"Level","Level");

Существует несколько способов решения этой проблемы:

1) Преобразование непосредственно в IEnumerable<SelectListItem>

// Controller action
var levels = logsData.GetLogLevels().Select(x => new SelectListItem { Text = x, Value = x }).ToList();

// Model class
public class LevelsListViewModel
{
    public List<SelectListItem> Levels { get; set; }
}

2) Использование перегрузки SelectList с одним параметром

var levels = new SelectList(logsData.GetLogLevels());

3) Использование ToDictionary()

var levels = new SelectList(logsData.GetLogLevels().ToDictionary(), "Key", "Value");

Примечание: Если EventLogs содержит несколько столбцов, вы не можете использовать Distinct() таким образом. Вы должны использовать GroupBy и Select первые различные значения:

var data = dbContext.EventLogs.GroupBy(x => x.Level).Select(gr => gr.FirstOrDefault()).ToList();
return data;
0 голосов
/ 30 октября 2018

Проблема заключается в этой строке:

var levels = new SelectList(logsData.GetLogLevels(),"Level","Level");

Метод GetLogLevels возвращает коллекцию string, которая не содержит свойства Level.

Есть два способа решения этой проблемы:

  • изменить тип возврата метода GetLogLevels, чтобы он возвращал коллекцию журналов событий со свойством Level; или
  • использует другой конструктор класса SelectList, который принимает только коллекцию объектов без указания имени свойства значения или имени свойства текста, например var levels = new SelectList(logsData.GetLogLevels());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...