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

ASP.NET Core MVC调用Controller添加元素后List为空如何解决

问题原因
  • ASP.NET Core 中 Controller 默认是瞬态生命周期,每收到一次HTTP请求,都会创建一个全新的HomeController实例
  • 你当前在HomeController的构造函数中每次都手动new JobRepository(),每次请求拿到的都是全新的JobRepository实例,其内部的jobs列表会重新初始化,自然无法保留之前请求添加的数据
解决方案

方案1:依赖注入注册单例服务(推荐)

利用ASP.NET Core内置依赖注入框架,将JobRepository注册为全局单例,所有请求共享同一个实例:

  1. 改造HomeController构造函数,改为依赖注入获取JobRepository实例,不要手动new:
[Route("[controller]/[action]")]
public class HomeController : Controller
{
    private readonly JobRepository _jobRepository;
    // 构造函数注入
    public HomeController(JobRepository jobRepository)
    {
        _jobRepository = jobRepository;
    }

    [HttpPost]
    public IActionResult AddJob(int job)
    {
        return Ok(_jobRepository.AddJob(job));
    }

    [HttpGet]
    public IActionResult GetAllJobs()
    {
        return Ok(_jobRepository.GetAllJobs());
    }
}
  1. 在应用启动配置类中注册单例服务,.NET 6+版本在Program.cs中添加如下代码:
var builder = WebApplication.CreateBuilder(args);
// 注册JobRepository为单例生命周期
builder.Services.AddSingleton<JobRepository>();
// 其余服务注册、中间件配置保持不变

如果是.NET 5及更早版本,在Startup.cs的ConfigureServices方法中添加上述服务注册代码即可。

方案2:将存储列表改为静态字段(仅临时测试用,不推荐)

将JobRepository中的jobs字段改为static静态字段,静态字段属于类级别,所有实例共享,不会随实例初始化重置:

public class JobRepository
{
    // 加static关键字改为静态字段
    static List<int> jobs  = new List<int>();

    public int AddJob(int job)
    {
        jobs.Add(job);
        return job;
    }

    public List<int> GetAllJobs()
    {
        return jobs;
    }
}

注意:静态字段生命周期和应用进程一致,多线程并发操作时需要加锁避免线程安全问题,且不方便单元测试,仅适合临时测试使用。

额外注意事项
  • 上述两种方案都是将数据存在内存中,应用重启、部署更新都会丢失数据,如果需要持久化存储请对接数据库、Redis等持久化组件
  • 高并发场景下操作共享集合时,建议使用线程安全集合(如ConcurrentBag<int>)代替普通List<int>,避免并发异常

内容的提问来源于stack exchange,提问作者Saghar Francis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:36:02