我试图允许在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的错误
感谢
答案 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)
您当前的控制器代码正在生成包含ListId
和ListName
属性的匿名项目集合。
特别是你的行声明的这个投影部分
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
另一种选择是从没有重复数据的源获取数据。也许是具有唯一记录的查找表。您可能需要对数据库设计进行调整。