从Dictionary创建SelectList后视图调用报错:不存在‘Key’属性
问题分析与解决
嘿,这个问题其实是因为你在重复包装SelectList的时候搞错了数据源的属性名~
咱们一步步拆解:
- 你在控制器里已经把
Dictionary<string, long>转换成了SelectList并赋值给ViewBag.act_type。这时候ViewBag.act_type里的每一项都是SelectListItem对象,它们的属性是Text(对应字典的Key)和Value(对应字典的Value),而不是原来字典的Key和Value。 - 但你在视图里又写了
new SelectList(ViewBag.act_type, "Value","Key"),这相当于告诉程序去遍历SelectListItem集合,找名为Key的属性——可SelectListItem根本没有这个属性,所以就报错啦!
两种正确的做法
做法一:控制器转好SelectList,视图直接用
控制器代码:
// 1. 创建并填充字典 Dictionary<string, long> actlist = new Dictionary<string, long>(); actlist.Add("线下讲座", 1); actlist.Add("线上直播", 2); actlist.Add("研讨会", 3); // 2. 直接转成SelectList存入ViewBag,指定Value和Text对应字典的键值 ViewBag.act_type = new SelectList(actlist, "Value", "Key");
视图代码:
// 直接使用已有的SelectList,不用再重新包装 @Html.DropDownList("acttype", ViewBag.act_type as SelectList, "请选择活动类型")
做法二:控制器存字典,视图再转SelectList
如果你想在视图里控制转换逻辑,那控制器里直接存原始字典就行:
控制器代码:
Dictionary<string, long> actlist = new Dictionary<string, long>(); actlist.Add("线下讲座", 1); actlist.Add("线上直播", 2); actlist.Add("研讨会", 3); // 直接把字典存入ViewBag ViewBag.act_type = actlist;
视图代码:
// 此时数据源是字典,所以可以指定"Value"和"Key" @Html.DropDownList("acttype", new SelectList(ViewBag.act_type, "Value", "Key"), "请选择活动类型")
这样就能避免那个属性找不到的错误啦~
内容的提问来源于stack exchange,提问作者Sachu
相关产品推荐
相关产品推荐

