Asp.Net MVC报错“Cannot perform runtime binding on a null reference”求助
Asp.Net MVC项目空引用运行时绑定异常问题
问题背景
原本运行正常的Asp.Net MVC项目突然出现异常,怀疑与Razor相关,更新Visual Studio后问题仍未解决。
相关代码
CSHTML代码
<div class="small-box bg-success"> <div class="inner"> <h3> @ViewBag.countActivityFinish </h3> <p>Tamamlanan Aktivite Sayısı</p> </div> <div class="icon"> <i class="ion ion-pie-graph"></i> </div> <a href="/Activity" class="small-box-footer">Aktiviteleri Gör <i class="fas fa-arrow-circle-right"></i></a> </div>
控制器代码
public ActionResult Index() { if (Session["user"] == null) return RedirectToAction("Index", "Login"); conn.Open(); User withEmailToUser = conn.Query<User>("SELECT * FROM [User] WHERE Email = @Email", new User() { Email = Session["user"].ToString() }).FirstOrDefault(); List<UserWrongLoginLog> userWrongLoginLogs = conn.Query<UserWrongLoginLog>("SELECT * FROM [UserWrongLoginLog] WHERE UserId = @UserId", new UserWrongLoginLog() { UserId = (Guid)withEmailToUser.Id }).ToList(); foreach (var item in userWrongLoginLogs) { conn.Execute("DELETE FROM [UserWrongLoginLog] WHERE Id=@Id", item); } int countCompany = conn.Query<int>("SELECT COUNT(*) FROM Company WHERE IsDelete = @IsDelete", new Company() { IsDelete = false }).FirstOrDefault(); int countContact = conn.Query<int>("SELECT COUNT(*) FROM Contact WHERE IsDelete = @IsDelete", new Contact() { IsDelete = false }).FirstOrDefault(); int countActivityWaiting = conn.Query<int>("SELECT COUNT(*) FROM Activity WHERE Status = @Status", new Activity() { Status = 0 }).FirstOrDefault(); int countActivityFinish = conn.Query<int>("SELECT COUNT(*) FROM Activity WHERE Status != @Status", new Activity() { Status = 0 }).FirstOrDefault(); conn.Close(); withEmailToUser.UserWrongLoginLogs = userWrongLoginLogs; ViewBag.countCompany = countCompany; ViewBag.countContact = countContact; ViewBag.countActivityWaiting = countActivityWaiting; ViewBag.countActivityFinish = countActivityFinish; ViewBag.user = withEmailToUser; return View(); }
错误信息
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对空引用执行运行时绑定
排查与解决建议
检查用户查询结果是否为空
代码中直接使用(Guid)withEmailToUser.Id,若Session["user"]对应的用户在数据库中不存在,withEmailToUser会为null,此处会抛出空引用异常,导致后续ViewBag赋值代码无法执行,Razor渲染时因ViewBag.countActivityFinish未初始化触发错误。需添加空判断:User withEmailToUser = conn.Query<User>("SELECT * FROM [User] WHERE Email = @Email", new User() { Email = Session["user"].ToString() }).FirstOrDefault(); if (withEmailToUser == null) { return RedirectToAction("Index", "Login"); // 或其他自定义处理逻辑 }确保数据库查询正常执行
虽然COUNT(*)查询即使无数据也会返回0,但需确认数据库连接conn是否正常,Activity表的Status字段是否存在且类型匹配,避免查询过程中出现未捕获异常导致ViewBag赋值中断。添加全局异常捕获
在项目中添加全局异常过滤器,捕获控制器执行过程中的异常,便于定位具体出错位置,而不是仅在Razor渲染时抛出模糊的空引用绑定错误。
内容的提问来源于stack exchange,提问作者Hasan Polat
相关产品推荐
相关产品推荐

