【问题标题】:Why am I getting an error that says there's no view data for my dropdownlist?为什么我收到一条错误消息,提示我的下拉列表没有视图数据?
【发布时间】:2025-12-22 17:35:11
【问题描述】:

我的模型链接了数据库中的 2 个表,因此在主表中创建新记录时,我需要允许我的用户在辅助表中选择一个项目。

我要链接的表是 RolesUsers

对于用户角色,当您创建新用户记录时,您将从下拉列表中选择一个角色。用户模型的总和如下所示:

public int Id { get; set; }
public int RoleId { get; set; }
public Role Role { get; set; }
public string Username { get; set; }
...

在表单上,​​您将从下拉列表中选择一个角色,这将为您提供 RoleId 的值,然后可以使用该值从数据库中选择角色:

@Html.DropDownList("RoleId", "Please select a user role.")

我遇到的问题(尽管我已经在另一个项目中使用了这个,我从中复制了代码)是 <select> 元素显然没有视图数据。

下面的实际错误文本:

System.Web.Mvc.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:没有具有键“RoleId”的“IEnumerable”类型的 ViewData 项。

知道我在这里做错了什么吗?

【问题讨论】:

  • 是否在数据库中扮演另一个表?
  • 你能展示一下
  • 您需要向我们提供您的视图模型的实际代码。创建一个MCVE。您的示例不完整,因为我们看不到您如何创建视图模型并将其提供给 HTML 帮助程序。您传递的参数似乎不正确。
  • 很遗憾我做不到,因为页面从未真正呈现

标签: c# asp.net-mvc model-view-controller


【解决方案1】:

您对.DropDownList 使用了无效的重载。没有只接受两个字符串的签名。您必须指定生成选择列表时要使用的值。

使用接收IEnumerable<SelectListItem> 的重载。例如:

@Html.DropDownList("RoleId", Model.ListOfRoles, "Please select a user role.")

如果您要创建新列表,则可以使用 ViewBag:

// SelectList(List<Role>, "Data Value Field", "Data Text Field");
ViewBag.RoleId = new SelectList(db.Roles, "RoleId", "RoleName");

@Html.DropDownList("RoleId", "Please select a role for this user")

【讨论】:

  • 我正在这里建立一对一的关系。每个用户 1 个角色。任何使用都不应拥有超过 1 个角色。
  • @Ortund,您仍然需要传入可选角色列表。除非您告诉它选项是什么,否则视图将如何呈现下拉列表?当用户从下拉列表中选择一个值时,该选项的值将绑定到RoleId
  • 当 RoleId 只取单个值时,它如何绑定到 RoleId? 1、2、3、4、5、6等……
  • @Ortund,使用 Html.DropDownList 时有两个相关属性。将保存所选值的属性以及可选选项的集合。当我从下拉列表中选择值为1 的“管理员”角色时,当我将模型发布到控制器时,RoleId 的值为 1。(并且 Model.ListOfRoles 将为空,每次重新显示视图时都必须重新绑定)
  • 对...我从旧项目ViewBag.RoleId = new SelectList(db.Roles, "RoleId", "RoleName", user.RoleId); 忘记了这一点
最近更新 更多