You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:45:34