【问题标题】:ASP.Net Core SelectList not displaying selected itemASP.Net Core SelectList 不显示所选项目
【发布时间】: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


【解决方案1】:

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

检查一下: Custom numeric format strings String.PadLeft Method

还有这个重要的公文包: Pad left with zeroes

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

【讨论】:

  • 感谢您的反馈。虽然 ID 标识符看起来像数字,但它们在 SQL Server DB 中被定义为 varchar,并且在使用前导零和引号进行调试时出现在任何地方。我之前从 nvarchar 更改为 varchar ro account for character width/size 但无济于事。
  • 随时欢迎您。好吧,格式化字符串varchar没问题。因为您可以使用 String 中的 PadLeft() 方法。我将编辑我的答案,请尽快检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多