Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从模型中获取唯一的选项列表以填充选择框_C#_Asp.net Mvc_Drop Down Menu_Viewbag - Fatal编程技术网

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

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> } 在您进行过滤之前,此功能可

我试图在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变量总是空的

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

有人能推荐吗

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

我的取景袋有什么问题


谢谢

我认为问题在于演员阵容:

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>)