asp.net-core - ASP.Net Core SelectList 不显示所选项目
问题描述
在 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))
解决方案
好吧,假设 selectedOrg 类型是数字,那么它应该按照 OrgID 格式转换为格式化字符串:
var formattedSelectedOrg = String.Format("{0:0000}", selectedOrg);
或者
// if selectedOrg is nullable numeric type
var formattedSelectedOrg = selectedOrg?.ToString("0000");
// if selectedOrg is base numeric type
var formattedSelectedOrg = selectedOrg.ToString("0000");
// if selectedOrg is String type (nullable)
var formattedSelectedOrg = selectedOrg?.Trim().PadLeft(4, '0');
Or
var number;
var formattedSelectedOrg =
String.Format("{0:0000}", Int32.TryParse(selectedOrg?.Trim(), out number) ? number : 0);
因此,当应用于您的代码时,它将具有可比性:
// assume selectedOrg is base numeric type
Selected = item.OrgID == selectedOrg.ToString("0000")
Or
// if selectedOrg is String type (nullable)
Selected = item.OrgID == selectedOrg?.Trim().PadLeft(4, '0')
Or
// if you prefer to use predefined formatted string
Selected = item.OrgID == formattedSelectedOrg
和
// assume selectedOrg is base numeric type
s => s.OrgID == selectedOrg.ToString("0000")
Or
// if selectedOrg is String type (nullable)
s => s.OrgID == selectedOrg?.Trim().PadLeft(4, '0')
Or
// if you prefer to use predefined formatted string
s => s.OrgID == formattedSelectedOrg
看看这个: 自定义数字格式字符串 String.PadLeft 方法
还有这个重要的公文包: 用零填充
希望这会有所帮助。享受你的编码!
推荐阅读
- python - 无法使用 pyspark 中的 output.show() 显示 spark sql 查询的输出
- java - 用户的自定义 updates.xml (Install4J)
- python - 当它们在列表中时如何将项目放入自己的单独字符串中
- javascript - Angular 6 - 是否可以在同一页面上使用两个 Angular 元素组件?
- sql-server - 需要远程查看的proc优化
- android - 实例化一个对象和调用 getApplicationContext() 有什么区别?
- spring - WebTestClient 未注入
- javascript - 为什么文本没有像应有的那样更改为“Testinghi”?
- r - 读取 RDS 中的错误
- c++ - 链表实现 C++