如何从模型中获取唯一的选项列表以填充选择框
How to get a unique list of options from a model to populate a selectbox
我正在尝试允许在 MVC 中动态过滤视图。
经过一番努力后,我尝试了这个...哪种方式有效
select 控件从模型中提取一组唯一的值来制作选项
foreach (var i in Model.Select(s => new{s.ListId, s.ListName}).Distinct())
{
<option value="@i.ListId">@i.ListName</option>
}
在您进行过滤之前,这可以正常工作。一旦你有了 运行 过滤器,你就只有你已经过滤的选项(即如果你选择在 ListID1 上过滤,唯一的 select 选项是 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 上做错了什么
谢谢
我认为问题出在此处:
var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;
如果我没看错你的代码,那么这段代码:
var listoflists = (from l in _context.UgPoints
select new { l.ListId, l.ListName } ).Distinct();
将创建一个匿名类型的列表,而不是 UgPoints,这意味着该转换将 return 为空。
希望这对您有所帮助,
魔术师
您当前的控制器代码正在生成一组具有 ListId
和 ListName
属性的匿名项目。
特别是你的行语句的这个投影部分
select new { l.ListId, l.ListName }
在您看来,您正试图将其转换为您的 class 的集合,但它失败了,因此您将 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
另一种选择是从没有重复数据的来源获取数据。也许是具有唯一记录的查找 table。您可能需要为此调整数据库设计。
我正在尝试允许在 MVC 中动态过滤视图。
经过一番努力后,我尝试了这个...哪种方式有效
select 控件从模型中提取一组唯一的值来制作选项
foreach (var i in Model.Select(s => new{s.ListId, s.ListName}).Distinct())
{
<option value="@i.ListId">@i.ListName</option>
}
在您进行过滤之前,这可以正常工作。一旦你有了 运行 过滤器,你就只有你已经过滤的选项(即如果你选择在 ListID1 上过滤,唯一的 select 选项是 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 上做错了什么
谢谢
我认为问题出在此处:
var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;
如果我没看错你的代码,那么这段代码:
var listoflists = (from l in _context.UgPoints
select new { l.ListId, l.ListName } ).Distinct();
将创建一个匿名类型的列表,而不是 UgPoints,这意味着该转换将 return 为空。
希望这对您有所帮助,
魔术师
您当前的控制器代码正在生成一组具有 ListId
和 ListName
属性的匿名项目。
特别是你的行语句的这个投影部分
select new { l.ListId, l.ListName }
在您看来,您正试图将其转换为您的 class 的集合,但它失败了,因此您将 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
另一种选择是从没有重复数据的来源获取数据。也许是具有唯一记录的查找 table。您可能需要为此调整数据库设计。