【问题标题】:ASP.Net Core MVC - List<SelectListItem> multiselect not showing select = true itemsASP.Net Core MVC - List<SelectListItem> 多选未显示 select = true 项目
【发布时间】:2020-09-25 06:02:34
【问题描述】:

我正在为“医疗用品”制作一个强类型的更新/创建视图,其中用户可以从收到List&lt;SelectListItem&gt; 的下拉列表中选择多个选项(“套件”)。该列表是&lt;select multiple="multiple"&gt;。它原本可以完美运行,但我一定是不小心改变了一些东西。

现在下拉列表不显示传递给它的 SelectListItems 为 selected = true 为已选择(由 VS 调试器验证),因此我可以选择新项目但不能取消选择以前选择的项目。我需要它来比较新选择的 ID 列表与旧选择的 ID 列表,以确定必须从 Db 中删除的内容。

这是我的视图模型:

 public class MedicalSupplyViewModel
    {
        public MedicalSupplyViewModel()
        {
            Supply = new MedicalSupply();
            KitList = new List<SelectListItem>();
            KitIds = new List<int>();
        }

        public MedicalSupply Supply { get; set; }
        public List<SelectListItem> KitList { get; set; }
        public string StringKits { get; set; }
        public List<int> KitIds { get; set; }

        public void KitStringSet()
        {
            IEnumerable<string> KitNames = Supply.KitSupplies.Select(ks => ks.Kit.Name);

            StringKits = Supply.KitSupplies.Count() == 0 ? "N/A" : string.Join(", " , KitNames);
        }
    }

这是我认为相关的cshtml:

<select multiple="multiple" class="form-control" id="kit_select" asp-for="KitIds" asp-items="Model.KitList"></select>

这是该页面的控制器方法的一部分,用于创建SelectListItems

DetailsModel.KitList = _db.Kits.ToList().ConvertAll(k =>
{
     return new SelectListItem()
     {
          Value = k.Id.ToString(),
          Text = k.Name,
          Selected = SelectedKits.Contains(k)
      };
});

即使将项目设置为 selected = true 也不会显示它们。我在所有地方都设置了断点,包括在视图中,除了呈现的 html 之外,我找不到所选属性与它应该在任何地方的差异。我还使用了不同的浏览器,并花了几个小时搜索互联网和这个网站。

这个问题的原因可能是什么?

【问题讨论】:

    标签: asp.net asp.net-core razor drop-down-menu asp.net-core-mvc


    【解决方案1】:

    您应该将所选项目的值设置为 KitIds。下面是我的测试示例:

    型号:

    public class MedicalSupplyViewModel
    {
        public MedicalSupplyViewModel()
        {
            KitList = new List<SelectListItem>();
            KitIds = new List<int>();
        }
    
        public List<SelectListItem> KitList { get; set; }
        public string StringKits { get; set; }
        public List<int> KitIds { get; set; }
    
    }
    public class Kit
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    控制器:

    public IActionResult Index()
        {
            List<Kit> kits = new List<Kit>
            {
                new Kit{ Id = 1, Name = "AA"},
                new Kit{ Id = 2, Name = "BB"},
                new Kit{ Id = 3, Name = "CC"},
            };
    
            List<Kit> SelectedKits = new List<Kit>
            {
                new Kit{ Id = 1, Name = "AA"},
                new Kit{ Id = 2, Name = "BB"}
            };
    
            var DetailsModel = new MedicalSupplyViewModel();
            DetailsModel.KitIds = SelectedKits.Select(x => x.Id).ToList();
            DetailsModel.KitList = kits.ToList().ConvertAll(k =>
            {
                return new SelectListItem()
                {
                    Value = k.Id.ToString(),
                    Text = k.Name
                };
            });
            return View(DetailsModel);
        }
    

    查看:

    <select multiple="multiple" class="form-control" id="kit_select" asp-for="KitIds" asp-items="Model.KitList"></select>
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多