如何从模型中获取唯一的选项列表以填充选择框
Posted
技术标签:
【中文标题】如何从模型中获取唯一的选项列表以填充选择框【英文标题】:How to get a unique list of options from a model to populate a selectbox 【发布时间】:2018-09-12 22:16:31 【问题描述】:我正在尝试允许在 MVC 中动态过滤视图。
经过一番折腾后,我尝试了这个......哪种有效
选择控件从模型中提取一组唯一的值来生成选项
foreach (var i in Model.Select(s => news.ListId, s.ListName).Distinct())
<option value="@i.ListId">@i.ListName</option>
在您进行过滤之前,这可以正常工作。运行过滤器后,您只有已过滤的选项(即,如果您选择在 ListID1 上过滤,则唯一的选择选项是 ListID1)
所以...
在控制器中,我从未过滤的模型中设置了一个列表并将其推到 ViewBag 中
public async Task<IActionResult> Index(int? ListID)
var listoflists = (from l in _context.UgPoints
select new l.ListId, l.ListName ).Distinct();
ViewBag.listoflists = listoflists;
然后在视图中我看那个
var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;
foreach (var l in lst)
<option value="@l.ListId"> @l.ListName</option>
但第一个变量始终为空。
我假设我错过了一些基本的东西,但我看不到什么。
任何人都可以提出建议
获取一组唯一值以过滤页面其余部分的更好方法
或
我在 viewbag 上做错了什么
谢谢
【问题讨论】:
【参考方案1】:我认为问题在于这里的演员:
var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;
如果我没看错你的代码,那么这段代码:
var listoflists = (from l in _context.UgPoints
select new l.ListId, l.ListName ).Distinct();
将创建一个匿名类型的列表,而不是 UgPoints,这意味着强制转换将返回 null。
希望这会有所帮助,
魔法师
【讨论】:
【参考方案2】:您当前的控制器代码正在生成具有ListId
和ListName
属性的匿名项目集合。
特别是你的行语句的这个投影部分
select new l.ListId, l.ListName
在您看来,您正试图将其转换为您的类的集合,但它失败了,因此您将 lst 设为 null。
您可以从您的 LINQ 语句中创建一个 SelectListItem
对象列表并将其设置为查看包。
var listoflists = (from l in _context.UgPoints
select new SelectListItem
Value= l.ListId.ToString(),
Text = l.ListName
).Distinct();
ViewBag.listoflists = listoflists;
现在在您看来,您甚至可以使用 DropDownList 辅助方法
@html.DropDownList("ListID",ViewBag.listoflists as IEnumerable<SelectListItem>)
请记住,您正在尝试对 UgPoints
对象的集合调用 Distinct()
方法。当类型是引用类型时,您可能希望重写该类型的 Equals 方法以使 Distinct 方法代码更容易。
Use of Distinct with list of custom objects
另一个选项是从没有重复数据的源获取数据。也许是一个具有唯一记录的查找表。您可能需要为此调整您的数据库设计。
【讨论】:
以上是关于如何从模型中获取唯一的选项列表以填充选择框的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 从 asp.net 列表框中仅获取当前选定的选项