[英]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.