You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中SelectList设置选中项后下拉框未生效如何解决

我已自行解决该问题,可直接查看文末的更新3。

我按如下方式基于List<ApplicationUserViewModel>构建SelectList:

List<ApplicationUserViewModel> selectableUsers = 
    auto.Map<List<ApplicationUserViewModel>>(users);

// 选中会议所有者:
foreach (ApplicationUserViewModel user in selectableUsers)
{
    if (user.Id == meeting.OwnerId)
    {
        user.Selected = true;
    }
}

// 我不确定下一步是否必要:
string selectedValue = selectableUsers
    .Where(u => u.Selected)
    .Select(i => i.Id).FirstOrDefault().ToString();

SelectUserViewModel vm = new() { 
    SelectableUsers = new SelectList(selectableUsers, "Id", "FullName", selectedValue)
};

我的表单视图的视图模型定义如下:

public class SelectUserViewModel
{
    public Guid MeetingId { get; set; }
    public MeetingViewModel Meeting { get; set; }
    public SelectList SelectableUsers { get; set; }
    public Guid UserId { get; set; }
}

ApplicationUserViewModel的定义如下:

public class ApplicationUserViewModel
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName => $"{LastName}, {FirstName}";

    // 其他大量属性...

    public bool Selected { get; set; }
}

视图中的下拉框代码:

<select asp-for="UserId" asp-items="@Model.SelectableUsers">
</select>

目标用户的Selected属性确实已设置为true,但页面渲染完成后,下拉框始终默认选中列表第一项。

更新1

我进行了调试,发现视图中所有选项的Selected属性均为False。为什么ApplicationUserViewModel的Selected属性没有传递到SelectList中?我遗漏了什么配置?

更新2

我尝试了回答和评论中的建议仍未解决问题,目前我的配置如下:
专门用于构建选择列表的新视图模型:

public class SelectableApplicationUserViewModel
{
    public string Id { get; set; }
    public string Name { get; set; }
    public bool Selected { get; set; }
}

构建List<ApplicationUserViewModel>:

List<ApplicationUserViewModel> users = auto.Map<List<ApplicationUserViewModel>>
    (meeting.Summonings.Select(u => u.User)).ToList();

设置选中用户:

foreach (ApplicationUserViewModel user in users)
{
    if (user.Id == meeting.OwnerId)
    {
        user.Selected = true;
    }
}

此时目标用户的Selected属性已正确设置为True。

将列表转换为List<SelectableApplicationUserViewModel>:

List<SelectableApplicationUserViewModel> selectableUsers = users
    .Select(s => new SelectableApplicationUserViewModel
{
    Id = s.Id.ToString(),
    Name = s.FullName,
    Selected = s.Selected
}).ToList();

此时目标用户的Selected属性仍为True。

获取选中用户后续作为参数传入:

SelectableApplicationUserViewModel selectedUser = selectableUsers
    .First(s => s.Selected);

已正确获取到目标选中用户。

构建视图模型:

SelectUserViewModel vm = new()
{
    SelectableUsers = new SelectList(selectableUsers, "Id", "Name", selectedUser) // <-- 此处传入的是正确的选中用户
    // 其他属性
};

最终视图中的代码:

<select asp-for="UserId" asp-items="@Model.SelectableUsers" class="form-control">
    <option value="" disabled>请选择用户...</option>
</select>

但此时所有用户的Selected属性都变为False。

更新3

最终发现,仅需给UserId赋值,表单就会正确选中对应用户!
修改后的视图模型构建代码:

SelectUserViewModel vm = new()
{
    MeetingId = meeting.Id,
    Meeting = auto.Map<MeetingViewModel>(meeting),
    SelectableUsers = new SelectList(users, "Id", "FullName"),
    UserId = meeting.OwnerId, // <-- 这就是问题的关键!
};

修改后的视图代码:

<select asp-for="UserId" asp-items="@Model.SelectableUsers" class="form-control">
    <option value="" disabled>请从列表中选择人员</option>
</select>

内容的提问来源于stack exchange,提问作者Stian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:42:04