ViewBag报“Value cannot be null”但值非空的问题求助
咱们来一步步排查问题,从你的代码和场景来看,主要有几个可能的原因,对应解决方法如下:
1. 部分分支未给ViewBag赋值
你的Action里有个关键分支:
if (!fechaInicio.HasValue || !fechafin.HasValue) return View();
当这个条件成立时(比如页面首次加载、没传日期参数),ViewBag.CurrentFechaInicio和ViewBag.CurrentFechaFin完全没被赋值。如果你的View里直接用@Html.DisplayText("CurrentFechaInicio"),此时ViewBag里找不到这个键,就会触发ArgumentNullException——哪怕你觉得测试时值是存在的,也可能在某些场景下进入了这个未赋值的分支。
解决办法:
确保所有分支都初始化ViewBag的这两个属性,哪怕是默认值:
// 把ViewBag赋值移到分支判断之前 ViewBag.CurrentFechaInicio = fechaInicio.HasValue ? fechaInicio.Value : (DateTime?)null; ViewBag.CurrentFechaFin = fechafin.HasValue ? fechafin.Value : (DateTime?)null; if (!fechaInicio.HasValue || !fechafin.HasValue) return View(); // 后续逻辑保持不变
或者在View里做null校验,避免直接调用DisplayText:
@if (ViewBag.CurrentFechaInicio != null) { @Html.DisplayText("CurrentFechaInicio") } else { <span>无日期数据</span> }
2. @Html.DisplayText的用法有误
如果你的View里是这么写的:
@Html.DisplayText(ViewBag.CurrentFechaInicio)
这就踩坑了!Html.DisplayText的参数应该是属性名称的字符串(比如"CurrentFechaInicio"),而非直接传入ViewBag的值。直接传值的话,一旦值为null就会触发异常——哪怕你认为值存在,也可能在分支场景下出现null的情况。
正确写法:
@Html.DisplayText("CurrentFechaInicio")
如果只是想输出日期值,其实没必要用Html.DisplayText,直接输出更灵活:
@ViewBag.CurrentFechaInicio?.ToString("yyyy-MM-dd HH:mm")
3. 检查所有返回View的分支是否都赋值了ViewBag
你的Action里还有return View("SinResultados");这个分支,如果SinResultados视图也用到了这两个ViewBag属性,那这个分支里也得给ViewBag赋值,否则同样会因为null触发异常。
建议你在抛出异常的位置加个调试输出(比如在View里写@ViewBag.CurrentFechaInicio),或者在Action里打个断点,确认到底是哪个分支导致了值为null的情况。
内容的提问来源于stack exchange,提问作者Vallo

