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>
结果:
我正在为 "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>
结果: