【问题标题】: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 => new{s.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 上做错了什么

谢谢

【问题讨论】:

    标签: c# asp.net-mvc drop-down-menu 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】:

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

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

      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

      另一个选项是从没有重复数据的源获取数据。也许是一个具有唯一记录的查找表。您可能需要为此调整您的数据库设计。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 2023-01-25
        • 2020-04-27
        • 1970-01-01
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        相关资源
        最近更新 更多