ASP.NET报Cannot perform runtime binding on a null reference错误怎么解决
错误产生原因
- 报错堆栈明确指向
Views/Content/CategoryContent.cshtml第2行出现动态绑定空引用异常,触发原因是该视图中访问了ViewBag下为null的对象属性:ViewBag属于C#动态类型,编译阶段不会校验属性是否存在、是否为空,只有运行时渲染视图时才会校验,空对象调用属性就会抛出该异常。 - 结合你提供的控制器代码和「误删ViewBag相关代码段」的说明可知:当内容存在关联分类时,你通过
RedirectToAction跳转到了CategoryContent动作,但该动作中原本用于给ViewBag.Content赋值的代码被删除,导致视图渲染时拿不到对应的数据,触发空引用错误。 - 额外潜在风险:你当前重定向逻辑中直接调用
repoContentCategories.TGet((int)content.ContentCategory).Title,如果对应分类ID不存在、返回null,也会触发同类空引用异常。
修复方案
1. 补全CategoryContent动作的ViewBag赋值逻辑
找到你的CategoryContent对应的控制器动作,补充查询数据、赋值ViewBag的代码,参考实现如下:
public IActionResult CategoryContent(string category, string url, int id) { // 根据传入的ID查询对应的内容数据 var content = repoContents.TGet(id); // 给ViewBag的Content属性赋值,和Index动作的else分支逻辑一致 ViewBag.Content = content; // 也可根据业务需要传入分类相关数据 ViewBag.CategoryTitle = category; return View(); }
2. 新增空引用校验(可选但推荐)
你可以在两个位置增加校验,避免后续同类问题:
- 控制器侧查询数据后先做非空判断,兜底返回404或者默认页:
public IActionResult CategoryContent(string category, string url, int id) { var content = repoContents.TGet(id); if(content == null) { return NotFound("对应内容不存在"); } ViewBag.Content = content; return View(); }
- 视图侧开头加非空判断,避免运行时崩溃:
@if(ViewBag.Content == null) { <p>当前内容不存在,请稍后重试</p> return; } @* 下方正常渲染内容属性即可 *@
3. 修复重定向逻辑的潜在空引用问题
修改Index动作的重定向分支,增加分类存在性校验:
if(content.ContentCategory != null && content.ContentCategory != 0){ var category = repoContentCategories.TGet((int)content.ContentCategory); // 分类不存在时走普通内容渲染逻辑,避免空引用 if(category == null) { ViewBag.Content = content; return View(); } return RedirectToAction("CategoryContent", new { category = category.Title, url = content.URL, id = content.ID }); }
内容的提问来源于stack exchange,提问作者Furkan Tombaş
相关产品推荐
相关产品推荐

