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
相关产品推荐
相关产品推荐

