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

时间:2018-04-03 14:28:10

标签: c# asp.net-mvc drop-down-menu viewbag

我试图允许在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变量始终为null。

我假设我错过了一些基本的东西,但我看不清楚。

任何人都可以建议

获取一组唯一值以过滤页面其余部分的更好方法

我对viewbag的错误

感谢

2 个答案:

答案 0 :(得分: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。

希望这有帮助,

新空气

答案 1 :(得分:0)

您当前的控制器代码正在生成包含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>)

请注意,您尝试在Distinct()个对象的集合上调用UgPoints方法。当类型是引用类型时,您可能希望覆盖它的Equals方法,以便更容易使用Distinct方法代码。

Use of Distinct with list of custom objects

另一种选择是从没有重复数据的源获取数据。也许是具有唯一记录的查找表。您可能需要对数据库设计进行调整。