C# 如何从模型中获取唯一的选项列表以填充选择框
我试图在MVC中允许动态过滤视图 经过一点伪装,我尝试了这个……哪种方法有效 选择控件从模型中提取一组唯一的值以生成选项C# 如何从模型中获取唯一的选项列表以填充选择框,c#,asp.net-mvc,drop-down-menu,viewbag,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> } 在您进行过滤之前,此功能可
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变量总是空的
我假设我错过了一些基本的东西,但我看不出是什么
有人能推荐吗
获取一组唯一值以过滤页面其余部分的更好方法
或
我的取景袋有什么问题
谢谢我认为问题在于演员阵容:
var lst = ViewBag.listoflists as IEnumerable<Draco2018MVC.Models.UgPoints>;
将创建一个匿名类型的列表,而不是UgPoints列表,这意味着强制转换将返回null
希望这有帮助
Magus您当前的控制器代码正在生成具有ListId和ListName属性的注释性项目集合 具体地说,这是您的行语句的一部分
select new { l.ListId, l.ListName }
在您看来,您正试图将其强制转换为类的集合,但失败了,因此您将lst设置为null
您可以根据LINQ语句创建SelectListItem对象的列表,并将其设置为view bag
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方法,以使独特的方法代码更容易使用
另一个选项是从没有重复数据的源获取数据。可能是具有唯一记录的查找表。为此,您可能需要对db设计进行调整
@Html.DropDownList("ListID",ViewBag.listoflists as IEnumerable<SelectListItem>)