Razor Page使用ViewData绑定CheckBoxList遇空引用等问题求助
问题分析与解决方案
核心错误点
你遇到的空引用异常,根源在于对SelectList的使用方式有误:
- 错误调用
ToList():直接对SelectList实例调用ToList()是错误的,SelectList本身并非IEnumerable<SelectListItem>的直接实现,必须通过它的Items属性获取选项集合。 - 非泛型集合未转换:
SelectList.Items是非泛型IEnumerable,直接调用ToList()会得到List<object>,后续访问item.Value、item.Text等属性时会因类型不匹配触发空引用异常。
修正后的Razor代码
<div class="form-group row"> <div class="col-md-12"> Select Test: <br /> @{ var selectList = ViewData["testSections"] as SelectList; if (selectList != null) { // 将非泛型的Items转换为SelectListItem泛型集合 var items = selectList.Items.Cast<SelectListItem>(); if (items.Any()) { foreach (var item in items) { <input type="checkbox" name="selectedItems" value="@item.Value" /> @item.Text <br /> } } } } </div> </div>
更简洁的替代方案(推荐)
跳过SelectList的中间转换,直接将实体集合传入ViewData,避免类型转换问题:
Controller代码修改
public async Task<IActionResult> Index() { var testSections = await _employeeService.GetTestSections(); ViewData["testSections"] = testSections; return View(); }
Razor代码修改
<div class="form-group row"> <div class="col-md-12"> Select Test: <br /> @{ var testSections = ViewData["testSections"] as List<ReassignmentSectionLookup>; if (testSections != null && testSections.Any()) { foreach (var section in testSections) { <input type="checkbox" name="selectedItems" value="@section.ReassignmentSectionLookupID" /> @section.Section <br /> } } } </div> </div>
额外说明
你原代码中@(Html.Raw(item.Selected ? "checked=\"checked\"" : ""))这段判断无效,因为创建SelectList时未传入选中项参数,item.Selected永远为false,可以直接移除。
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

