[英]ASP.NET Core 2.1 Dropdown empty
我有這個下拉菜單,其中應該包含項目列表
這是我獲取清單的方式
public IEnumerable<string> GetLogLevels()
{
var data = dbContext.EventLogs.Distinct().ToList();
var modifiedData = data.Select(u => u.Level);
return modifiedData;
}
這是我的控制器和viewmodel
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>";
現在的問題是由於某種原因它加載了一個空列表。 調試控制器時,可以看到自己的值。
在旁注中,這是獲取一個字段並填充列表的正確方法嗎? 我只想要一個獨特的價值。
這行引起問題,因為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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.