如何从模型中获取唯一的选项列表以填充选择框

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 为空。

希望这对您有所帮助,

魔术师

您当前的控制器代码正在生成一组具有 ListIdListName 属性的匿名项目。

特别是你的行语句的这个投影部分

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。您可能需要为此调整数据库设计。