【发布时间】:2020-01-23 14:17:12
【问题描述】:
在 VS 2017 (MVC) 中使用 ASP.Net core 2.2:
我有一个基于向导的屏幕,其中包含组织的下拉列表。 当我从数据库加载记录时,我想将选择列表设置为数据库中的值。
剧透警告:最初显示页面时未选择指定的项目。
当手动选择项目时,单击“下一步”按钮,然后单击“上一个”按钮,返回第一页,项目按我的意愿选择。
在将模型加载到控制器中以进行首次显示时,以下方法均未设置所选项目(“0403”)的“选定”属性。
方法 2 中的比较永远不会计算为真,即使我在调试时可以看到比较的值相等。
即使我在调试时可以看到比较的值相等,方法 3 也找不到该项目
即使我在调试时可以看到比较的值相等,方法 4 也找不到该项目
这一切都发生在Controller中,所以请不要建议在View中更改下拉菜单的名称。
**组织表
ORG ID OrgName**
0004 Org 4
0007 Org 7
0008 Org 8
0403 Org 403
这是我的源查询:
var orgsQuery = from s in _context.Orgs
orderby s.OrgID
select s;
这些是我尝试在控制器中构建选择列表的各种方法:
1).
SelectList oList = new SelectList(orgsQuery.AsNoTracking(), "OrgID", "OrgName", selectedOrg);
2)。
List<SelectListItem> oList = new List<SelectListItem>();
foreach ( var item in OrgsQuery)
{
oList.Add(new SelectListItem()
{
Text = item.OrgName,
Value = item.OrgID,
Selected = (item.OrgID == (string)selectedOrg ? true : false)
});
}
3).
if (selectedOrg != null)
{
oList = new SelectList(OrgsQuery.AsNoTracking(),"OrgID", "OrgName", OrgsQuery.First(s =>
s.OrgID == (string)selectedOrg));
}
else
{
oList = new SelectList(OrgsQuery.AsNoTracking(), "OrgID", "OrgName", selectedOrg);
}
4)。
SelectList oList =
new SelectList(_context.Org.OrderBy(r => r.OrgID),
_context.Org.SingleOrDefault(s => s.OrgID == (string)selectedOrg))
【问题讨论】:
-
您确定您的源查询没有返回 IQueryable?您是否尝试过添加 .ToList() 然后测试您的代码?
-
我尝试了你的建议。由于当我返回页面时相同的例程起作用,所以我没有期望成功,也没有体验成功。虽然学校列表始终来自数据库(并且以其他方式正确呈现),但当正确设置列表时,所选值来自 HttpContext.Session 而不是数据库(单击向导上下文中的“上一个”按钮) ,我还不倾向于认为价值的直接来源是相关的。
标签: asp.net-core model-view-controller selectlist selectlistitem