如何从模型中获取独特的选项列表以填充Selectbox



我试图允许在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>}
        }

但是lst变量始终为空。

我假设我错过了一些基本的东西,但是我看不到什么。

任何能够建议的人

获得唯一值的更好方法来过滤页面的其余部分

我在ViewBag上做错了什么

谢谢

我认为问题是在这里进行的:

var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;

如果我要正确读取您的代码,则此代码:

var listoflists = (from l in _context.UgPoints
                   select new { l.ListId, l.ListName } ).Distinct();

将创建一个匿名类型的列表,而不是ugpoint的列表,这意味着演员将返回null。

希望这会有所帮助,

magus

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

特别是您的行语句的投影部分

select new { l.ListId, l.ListName } 

在您看来,您正在尝试将其投入到班级的集合中,并且失败了,因此您将其视为null。

您可以从LINQ语句中创建SelectListItem对象的列表,然后将其设置为查看袋子。

var listoflists = (from l in _context.UgPoints
                                 select new SelectListItem { 
                                                Value= l.ListId.ToString(),
                                                Text = l.ListName }
                  ).Distinct();
ViewBag.listoflists = listoflists;

现在在您的视图中,您甚至可以使用下拉列表助手方法

@Html.DropDownList("ListID",ViewBag.listoflists as IEnumerable<SelectListItem>)

请记住,您正在尝试在UgPoints对象集合上调用Distinct()方法。当类型是参考类型时,您可能需要覆盖其等于的方法,以使独特的方法代码更容易。

使用自定义对象列表的不同使用

另一个选项是从没有重复数据的来源获取数据。也许是一个具有独特记录的查找表。您可能需要对DB设计进行调整。

最新更新