将实体检索为SelectListItems

时间:2014-12-19 21:03:31

标签: c# linq entity-framework asp.net-mvc-4 selectlistitem

希望有人可以指出我在这里做错了什么。我试图从DbContext检索多个对象,并在检索它们时将它们转换为SelectListItem。我已经阅读了几篇关于此的帖子,他们似乎也在做同样的事情,但是当我运行这段代码时,它总是只是一个名为" System.Web的SelectListItem的SelectList。 MVC.SelectListItem"和Id为空。这是代码:

        var wtf = db.Departments.ToList().Select(m => new SelectListItem
        {
            Text = m.Name,
            Value = m.Id.ToString()
        });

        SelectList dafuq = new SelectList(wtf);

        ViewBag.Departments = dafuq;

        return View(model);

不会抛出异常或其他任何异常。

如果我只是打电话

var omg = db.Departments.ToList();

之前它按预期返回对象。

谢谢!

4 个答案:

答案 0 :(得分:3)

请改为尝试:

var wtf = db.Departments.ToList()
var dafuq = new SelectList(wtf, "Id", "Name");
ViewBag.Departments = dafuq;

return View(model);

答案 1 :(得分:1)

您不需要SelectList。使用1参数构造函数创建的SelectList通过调用IEnumerableConvert.ToString()中的所有值转换为字符串,这就是您在此处看到的内容。

如果您有IEnumerable<SelectListItem>wtf是什么),那么您可以将其直接传递给DropDownList助手。

只需在下拉列表中使用wtf对象,然后跳过SelectList

 ViewBag.Departments = wtf;

 @Html.DropdownListFor(m => m.Something, ViewBag.Departments);

正如vorninp指出的那样,在致电.ToList()之前,您无需致电.Select()。事实上,我建议反对它。

答案 2 :(得分:0)

如果我没有弄错,这种形式的构造函数只需要包含可枚举的项目,然后将这些项目内部转换为selectlistitems。

因此,您可以传递departmens并指向文本和数据字段的属性:

new SelectList(departments,"Id","Name")

答案 3 :(得分:0)

或者只是 -

ViewBag.Departments= db.Departments.ToList();

在视野中 -

@Html.DropdownListFor(m=>m.Departments,new SelectList(ViewBag.Departments,"ID","DepartmentName"),"Select Dropdown...",htmlAttributes:new{})