首页 > 解决方案 > 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))

标签: asp.net-coremodel-view-controllerselectlistselectlistitem

解决方案


好吧,假设 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 方法

还有这个重要的公文包: 用零填充

希望这会有所帮助。享受你的编码!


推荐阅读