ASP.NET MVC传递ID至Action方法时出现ID=0传入引发空引用异常
问题分析与解决方案
核心问题
当传入ID=0时,ProjectStore.GetProjectsBy(0)会返回null(所有项目ID从1开始),而视图直接访问@Model.Id等属性,触发NullReferenceException。ID=0的出现通常是路由允许ID可选,或页面存在未正确传递ID的请求触发。
第一步:立即修复空引用异常
修改Action方法处理空值
在ProjectDetails方法中先判断查询结果是否为空,避免将null传递给视图:
public IActionResult ProjectDetails(long id) { var projectById = Data.ProjectStore.GetProjectsBy(id); if (projectById == null) { // 返回404页面或自定义错误视图 return NotFound(); // 也可使用 return View("Error"); } return View(projectById); }
视图增加空值防护(可选)
即使Action已处理null,视图中增加检查可进一步避免意外:
<section class="contact-section px-3 py-5 p-md-5"> <div class="container"> @if (Model != null) { <table class="table table-bordered table-hover"> <thead> <tr> <td>ID</td> <td>Name</td> <td>Description</td> <td>Client</td> <td>Image</td> </tr> </thead> <tbody> <tr> <td>@Model.Id</td> <td>@Model.Name</td> <td>@Model.Description</td> <td>@Model.Client</td> <td><img src="~/assets/images/project/@Model.Image" width="50px" /></td> </tr> </tbody> </table> } else { <p>未找到指定项目</p> } </div> </section>
第二步:排查并解决ID=0的来源
约束路由参数
如果使用默认路由{controller}/{action}/{id?},id?表示可选,直接访问/Controller/ProjectDetails时long类型id会取默认值0。可修改路由强制id为正整数:
// .NET 6+ 在Program.cs,旧版本在Startup.cs中修改路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id:int:min(1)}");
{id:int:min(1)}约束id必须是≥1的整数,非法请求直接返回404,避免ID=0传入。
检查页面请求触发点
确保所有调用ProjectDetails的链接都正确传递id,比如项目列表页的链接应写为:
@foreach (var item in Model) { <td><a asp-action="ProjectDetails" asp-route-id="@item.Id">查看详情</a></td> }
避免遗漏asp-route-id参数或错误传递0的情况。
内容的提问来源于stack exchange,提问作者MoHoMe
相关产品推荐
相关产品推荐

