【问题标题】:Using SelectList to get AspNetUsers' Id from a DropDownList使用 SelectList 从 DropDownList 中获取 AspNetUsers 的 ID
【发布时间】:2019-12-23 14:29:24
【问题描述】:

Create 方法中,我有一个字段将参数AssignedTo 传递给作为AspNetUsers 表的外键的数据库列。我将用户名列表存储在 Viewbag 中,使它们在 DropDownList 中全部可见。

public IActionResult Create()
{
    ViewBag.Users = userManager.Users.Select(u => u.UserName).ToList();
    return View();
}

在视图中,代码如下:

<div class="form-group">
    <label asp-for="AssignedTo"></label>
    @Html.DropDownList("YourDropDownList", new SelectList(ViewBag.Users))
    <select asp-items="@new SelectList(ViewBag.Users)" asp-for="AssignedTo"></select>
</div>

这里的问题是我的AssignedTo 获取了 AspNetUser UserName 的值。根据过去问题的建议,我将选择构造函数更改为 new SelectList(Viewbag.Users, nameof(AppUser.Id), nameof(AppUser.UserName)) 但这并不好,因为它返回:

NullReferenceException:对象引用未设置为对象的实例。

这可能是因为我用于此视图的模型不包含AppUser?我该如何解决这个问题?

【问题讨论】:

  • 首先,始终使用专用的视图模型类,然后使用Html.DropDownListFor(而不是DropDownList)来引用视图模型的属性。并且不要使用实体类型作为根视图模型。而且从不使用ViewBag,因为它不是强类型的。
  • 不要将 HTML 助手与标签助手混用。您当前的 cshtml 将呈现两个单独的 &lt;select&gt; 元素。
  • 老实说 - 完全避免 SelectList,IMO。
  • 好的!谢谢你的建议。我将尝试对其进行整理,并最终返回有关其工作原理的更新。

标签: c# html asp.net-core


【解决方案1】:

要从 DropDownList 获取 AspNetUsers 的 Id,您可以使用 ViewBag,如​​下所示:

public IActionResult CreateTask()
{
    ViewBag.Users = new SelectList(_userManager.Users, nameof(AppUser.Id), nameof(AppUser.UserName));
    return View();
}

任务模型:

public class TaskModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string AssignedTo { get; set; }

    //other properties
}

在视图中

<div class="form-group">
    <label asp-for="AssignedTo"></label>
    <select asp-for="AssignedTo" asp-items="@ViewBag.Users"></select>
</div>

您可以参考here 了解如何填充 Select 标签助手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多