将实体检索为选择列表项

本文关键字:列表 选择 实体 检索 | 更新日期: 2023-09-27 18:34:55

希望有人能指出我在这里做错了什么。 我正在尝试从DbContext中检索多个对象,并在检索它们时将它们转换为SelectListItem。 我已经读过几篇关于这个的文章,他们似乎在做和我一样的事情,但是当我运行这段代码时,它总是只是一个选择列表项的选择列表,其名称为"System.Web.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();

在此之前,它会按预期返回对象。

谢谢!

将实体检索为选择列表项

试试这个:

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

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

如果您有IEnumerable<SelectListItem>(这就是wtf(,则可以将其直接传递给 DropDownList 帮助程序。

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

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

正如 vorninp 指出的那样,在拨打.Select()之前,您无需致电.ToList()。事实上,我会建议不要这样做。

如果我没记错的话,这种形式的构造函数期望只有可枚举的包含项目,然后在内部转换为选择列表项。

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

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

或者只是-

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

而在视野中——

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