ASP.NET Core DropDownList报错Value cannot be null问题排查求助
问题根因
触发RUT已注册的校验逻辑后,页面回显时下拉列表数据源丢失为空,导致DropDownList辅助方法渲染时抛出空参数错误,具体根因有两点:
OnGet方法中_dataInput不为空的分支处理逻辑存在遗漏:校验失败后_dataInput仅保留了用户输入的患者信息,没有重新加载Genero_Lista、Comuna_Lista、Odontologo_Lista三个下拉列表的数据源,直接把_dataInput赋值给MODEL_PACIENTE传入视图,导致下拉列表数据源为空。- 三个获取下拉列表的
GetXXX方法初始值设为null,如果查询过程中出现异常,会直接返回null而非空列表,也会触发空值错误。
解决方案
1. 补充OnGet方法的下拉列表加载逻辑
修改_dataInput不为空的处理分支,补充三个下拉列表的重新加载代码:
if (_dataInput != null) { MODEL_PACIENTE = _dataInput; MODEL_PACIENTE.AvatarImage = null; // 新增以下3行代码,重新加载下拉列表数据源 MODEL_PACIENTE.Genero_Lista = _lPacienteGen.GetGenero(_context); MODEL_PACIENTE.Comuna_Lista = _lComuna.GetComuna(_context); MODEL_PACIENTE.Odontologo_Lista = _lOdontologo.GetOdontologo(_context); }
2. 优化GetXXX方法避免返回null
调整三个获取下拉列表的方法,初始化时直接创建空列表,避免异常场景返回null,示例修改GetComuna方法:
public List<SelectListItem> GetComuna(ApplicationDbContext context) { // 初始化直接创建空列表,不要赋值为null List<SelectListItem> selectListItems = new List<SelectListItem>(); try { context.TBL_PROVINCIA.ToList().ForEach(item => { selectListItems.Add(new SelectListItem { Value = item.PROV_ID.ToString(), Text = item.PROV_NOMBRE }); }); } catch (Exception ex) { Console.WriteLine($"Error: '{ex}'"); } return selectListItems; }
GetOdontologo、GetGenero两个方法按同样逻辑修改即可。
3. 视图层增加空值防护(可选)
在渲染下拉列表前先判断数据源是否为空,为空则赋值空列表,进一步避免报错:
@{ // 渲染下拉列表前补充空值判断 if (Model.MODEL_PACIENTE.Comuna_Lista == null) { Model.MODEL_PACIENTE.Comuna_Lista = new List<SelectListItem>(); } } @Html.DropDownList("MODEL_PACIENTE.PAC_COMUNA", new SelectList(Model.MODEL_PACIENTE.Comuna_Lista, "Text", "Text"),"ESCOGA UNA COMUNA", new { @class = "form-control" })
其他下拉列表也按同样逻辑增加防护即可。
内容的提问来源于stack exchange,提问作者Carrobe90
相关产品推荐
相关产品推荐

