ASP.NET MVC ViewBag.Message报空引用运行时绑定错误如何解决
报错根因
异常抛出和视图层的非空判断没有任何关系,问题出在控制器中给ViewBag赋值的写法完全错误:ViewBag是ASP.NET MVC提供的动态类型属性容器,给它挂载属性是赋值操作,不是方法调用。你代码中写的ViewBag.Message("Updated Successfully")是把ViewBag.Message当作可执行方法传入参数调用,但此时ViewBag.Message从未被赋值,默认值为null,运行时尝试对null执行方法绑定,就会直接抛出Cannot perform runtime binding on a null reference异常,代码执行到这一行就会中断,根本不会走到后续的视图渲染流程,你在视图里写的非空判断自然没有生效机会。
修复方案
- 修正控制器中所有
ViewBag.Message的赋值逻辑,把错误的方法调用写法改为属性赋值:
找到控制器里两处错误写法:
替换为正确的赋值语法:// 原错误写法 ViewBag.Message("Updated Successfully"); ViewBag.Message("Failed ! Please try again");// 修正后写法 ViewBag.Message = "Updated Successfully"; ViewBag.Message = "Failed ! Please try again"; - 可选优化:现有视图逻辑无论操作成功还是失败都显示绿色提示,体验不合理,可以新增一个ViewBag字段区分消息状态:
控制器赋值时同步传状态:
视图中根据状态切换样式:// 操作成功分支 ViewBag.Message = "Updated Successfully"; ViewBag.MsgStatus = "success"; // 操作失败分支 ViewBag.Message = "Failed ! Please try again"; ViewBag.MsgStatus = "error";@if (ViewBag.Message != null) { var fontColor = ViewBag.MsgStatus == "success" ? "green" : "red"; <p style="color:@fontColor;font-size:16px;"> @ViewBag.Message </p> } - 额外风险规避:当前代码直接将入参
list返回到视图,建议在方法入口处增加入参非空判断,避免list为null时触发其他空引用异常。
内容的提问来源于stack exchange,提问作者MarwanAbu
相关产品推荐
相关产品推荐

