EF Core .ToList() 查询返回“{Namespace.Models.Model}”而不是数据

EF Core .ToList() Query Returning "{Namespace.Models.Model}" Instead of Data

我有一个名为 Situation 的模型,我只是获取了所有模型,因此我可以将它们列在视图的下拉框中。这是我的查询:

var situations = _context.Situations.ToList();

下拉框:

@Html.DropDownList("SituationID", null, "Pick One: ", new { @class = "form-control" })

奇怪的是 returned 集合中的每个元素都是我的 Namespace.Models.Situation 而不是顶层的值。

我对 return 用户 (public class ApplicationUser : IdentityUser) return 的 [0]、1... 的电子邮件地址的其他查询,然后是他们下面的属性。以下是断点处的屏幕截图:

除了我对如何使用 @Html.DropDownList HtmlHelper 仍然知之甚少(在其他问题中有更多介绍)之外,我无法弄清楚两者之间有什么不同。没有明显的错误,但我不知道从这里去哪里。谢谢!

这不是 Ef 问题。这是你渲染 DropDownList 的错。 您必须将数据模式更改为适当的数据结构,例如字典或值文本 class (SelectList)。然后将其绑定到您的 DropDown。

这是您的问题的代码示例:

ViewBag.SituationList = _context.Situations.Select( x=> new SelectListItem{Value= x.Id, , Text= x.SituationName}).ToList();

然后使用此代码将其绑定到您的下拉列表:

@Html.DropDownListFor(model => model.label, (SelectList)ViewBag.SituationList)

我认为您需要将 Situation 项目列表转换为 SelectListItem 列表。它应该是这样的:

ViewBag.Situations = _context.Situations
    .Select(situation => new SelectListItem { Text = situation.XXX, Value = situation.YYY })
    .ToList();

然后在你看来:

@Html.DropDownList("SituationID", ViewBag.Situations, "Pick One: ", new { @class = "form-control" })

其中 XXXYYY 是您要用作项目显示文本和项目 ID(分别)的属性。

您还可以查看 Using the DropDownList Helper with ASP.NET MVC 以获得完整示例。

希望对您有所帮助!

如果你有一个对象集合,比如 Situation 对象,它有很多属性,比如 ExitURL 和 Caption,并且你告诉一些列表助手使用这个集合作为列表的数据源,它不知道哪个 属性 你想选择作为显示文本。因此,它只会在每个对象上调用 ToString 并使用返回的内容作为显示文本。在其默认实现中,ToString returns 对象类型的表示 - 这就是您所看到的

这样你就有了选择;

  • 坚持您当前的风格并重写 ToString,这样它 returns 显示的文本,
  • 将 Situation 对象的集合缩减为字符串集合(对于每个 Situation,从您喜欢的任何属性中创建一个表示它的字符串)并将该字符串集合用作您的列表驱动程序,或者
  • 将集合转换为 SelectListItem 集合,这样您就可以让列表助手访问它知道如何使用的对象集合 - 这样您就可以将其定向到您想要使用的情况 属性对于结果 HTML 的各种属性(例如,使用 ExitUrl 作为 HTML 控件的值,使用 Caption 作为显示文本)。你在哪里进行这种转换可能取决于你需要如何重用你的数据