ASP.NET MVC 5调用Razor页面时空引用异常的解决方法
ASP.NET MVC 5 Razor页面空引用异常解决方法
问题背景
使用C# ASP.NET MVC 5开发时,调用Products Razor页面触发「Object reference not set to an instance of an object」空引用异常,相关代码已提供,尝试过添加视图模型到数据集、实例化返回模型、脚手架生成页面、添加判断逻辑等方案未解决。
核心排查与解决步骤
1. 检查依赖注入配置
控制器和业务服务均使用构造函数注入,但如果未在项目中注册IProductService和IProductRepository的实现类,会导致注入对象为null,调用方法时触发异常。
若使用ASP.NET MVC 5(需依赖第三方DI容器,如Unity):
安装Unity.Mvc5 NuGet包后,在Global.asax的Application_Start方法中添加注册代码:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册依赖关系 var container = new UnityContainer(); // 替换为你的IProductRepository实际实现类 container.RegisterType<IProductRepository, ProductRepository>(); container.RegisterType<IProductService, ProductService>(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); }
若实际使用ASP.NET Core MVC(控制器引用了Microsoft.AspNetCore.Mvc):
在Program.cs(.NET 6+)或Startup.cs的ConfigureServices方法中注册服务:
builder.Services.AddScoped<IProductRepository, ProductRepository>(); builder.Services.AddScoped<IProductService, ProductService>();
2. 修复业务服务的空引用风险
ProductService中调用_productRepository.GetProducts()时,若仓储返回null,调用ToList()会直接触发空引用。修改代码确保返回安全的空列表:
public ProductViewModel GetProdutcts() => new ProductViewModel() { // 空合并运算符确保Product属性永远不为null Product = _productRepository.GetProducts()?.ToList() ?? new List<Product>(), };
3. 修正Razor视图的空值判断
视图中需先验证模型及属性是否为null,再进行遍历操作:
@model Shop.Application.ViewModels.ProductViewModel @{ ViewBag.Title = "Products"; } <h2>产品列表</h2> @if (Model?.Product != null && Model.Product.Any()) { <ul> @foreach (var product in Model.Product) { <li>@product.Name</li> <!-- 替换为你的Product实体实际属性 --> } </ul> } else { <p>暂无产品数据</p> }
4. 调试定位具体空对象
在Visual Studio中设置断点:
- 在
ProductsController.Index方法中,检查_productService是否为null; - 在
ProductService.GetProdutcts方法中,检查_productRepository和_productRepository.GetProducts()的返回值; - 在视图中检查
Model是否为null。
通过断点可精准定位哪个对象为null,针对性修复。
内容的提问来源于stack exchange,提问作者Thomaz Henrique
相关产品推荐
相关产品推荐

