我试图允许在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
您的当前控制器代码正在生成具有ListId
和ListName
属性的匿名项目的集合。
特别是您的行语句的投影部分
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设计进行调整。