【问题标题】:EF Core .ToList() Query Returning "{Namespace.Models.Model}" Instead of DataEF Core .ToList() 查询返回“{Namespace.Models.Model}”而不是数据
【发布时间】:2019-05-27 07:14:54
【问题描述】:

我有一个名为 Situation 的模型,我只是简单地获取所有模型,以便可以在视图的下拉框中列出它们。这是我的查询:

var situations = _context.Situations.ToList();

下拉框:

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

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

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

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

【问题讨论】:

标签: c# asp.net-identity entity-framework-core


【解决方案1】:

这不是 Ef 问题。这是你在渲染 DropDownList 时的错。 您必须将数据架构更改为适当的数据结构,例如 Dictionary 或 An Value-Text 类 (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)

【讨论】:

  • 3 错误:1)“选择列表不包含‘值’的定义”,2) 1)“选择列表不包含‘文本’的定义”,3)‘ SelectList' 不包含采用 0 个参数的构造函数。
  • 是的,你说得对,这是我的错字...我编辑了我的答案。
【解决方案2】:

我认为您需要将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 以获得完整示例。

希望对你有帮助!

【讨论】:

  • 感谢 Itay,但我不确定 DropDownList 代码应该是什么样子。有小费吗?我也在通过那个 MS 指南工作:)
  • 这有助于填充列表项和值,现在我只需要弄清楚为什么 SituationIDApplicationUserId 字段没有在数据库中更新。那是另一次了。 :)
【解决方案3】:

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

因此你有一个选择;

  • 保持当前样式并覆盖 ToString,以便它返回文本以供您显示,
  • 将 Situation 对象的集合简化为字符串集合(对于每个 Situation,从您喜欢的任何属性中创建一个表示它的字符串)并将该字符串集合用作您的列表驱动程序,或者
  • 将集合转换为 SelectListItem 集合,这样您就可以让列表帮助程序访问它知道如何使用的对象集合 - 因此您可以指示您希望将哪个 Situation 属性用于结果的各种属性HTML(例如,使用 ExitUrl 作为 HTML 控件的值,使用 Caption 作为显示文本)。在哪里进行此转换可能取决于您需要如何重用数据

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2021-12-01
    • 2021-11-06
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多