ASP.Net Core MVC - List<SelectListItem> multiselect 未显示 select = true items

ASP.Net Core MVC - List<SelectListItem> multiselect not showing select = true items

我正在为 "Medical Supplies" 创建一个强类型 update/create 视图,用户可以在其中从收到 select 的下拉列表中选择多个选项 ("Kits") =16=]。该列表是 <select multiple="multiple">。本来是完美的,但一定是我不小心改了什么。

现在下拉列表不显示传递给它的 SelectListItems 作为 selected = true 作为 selected(经 VS 调试器验证),所以我可以 select 新项目但是不是 deselect 以前 selected 的。我需要这个来比较新的 selection 和旧的 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 也不会显示它们。我在任何地方都设置了断点,包括在视图中,但我找不到 selected 属性 和除了呈现的 html 之外的任何地方应该有的差异。我也使用过不同的浏览器,并花了几个小时搜索互联网和这个网站。

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

您应该将所选项目的值设置为 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>

结果: