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

NullReferenceException求助:ViewModel无法将CSV数据正确传递至视图

解决NullReferenceException及ViewModel数据传递问题

我来帮你一步步排查并解决这个问题:

1. 核心问题:ViewModel属性未正确赋值

你在StockInfoViewModel的构造函数里犯了一个常见错误——新建了一个局部变量Stocks,而不是给类的公共属性赋值。

看你构造函数里的代码:

List<Stock> Stocks = new List<Stock>(); // 这是局部变量,和类的Stocks属性无关

这段代码创建的是构造函数内部的局部变量,类的public IEnumerable<Stock> Stocks属性根本没被赋值,所以Controller里获取到的自然是null。

修改ViewModel构造函数

把局部变量改成给类的属性赋值:

public class StockInfoViewModel
{
    public IEnumerable<Stock> Stocks { get; set; }

    public StockInfoViewModel()
    {
        // 直接初始化类的Stocks属性,而不是新建局部变量
        var stocksList = new List<Stock>();
        // 建议用Path.Combine构建路径,避免相对路径问题
        string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "companylist.csv");
        
        using(var reader = new StreamReader(file))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(',');
                // 注意:手动Split可能会有CSV格式问题(比如字段包含逗号并被引号包裹),如果有问题可以改用CsvHelper
                stocksList.Add(new Stock { Name = values[1], Symbol = values[0] });
            }
        }
        // 把填充好的列表赋值给类的属性
        Stocks = stocksList;
    }
}

2. Controller与视图的模型不匹配

你的Razor视图声明的模型是StockInfoViewModel:

@model StockApp.ViewModels.StockInfo.StockInfoViewModel

但Controller里却只传递了Stocks集合给视图:

var ViewModel = new ViewModels.StockInfo.StockInfoViewModel().Stocks;
return View(ViewModel);

这会导致视图里的Model实际上是IEnumerable<Stock>类型,而不是StockInfoViewModel,当你访问Model.Stocks时,就会因为Model是集合没有这个属性而抛出NullReferenceException。

修改Controller代码

应该把整个ViewModel实例传递给视图:

public IActionResult StockInfo()
{
    var viewModel = new ViewModels.StockInfo.StockInfoViewModel();
    return View(viewModel); // 传递完整的ViewModel,而不是只传Stocks
}

3. 额外优化建议

  • CSV读取的可靠性:手动用Split(',')处理CSV文件很容易出错(比如字段包含逗号且被引号包裹的情况),你已经引用了CsvHelper,建议改用它来读取:
    using(var reader = new StreamReader(file))
    using(var csv = new CsvReader(reader, System.Globalization.CultureInfo.InvariantCulture))
    {
        // 假设CSV的列头是Symbol,Name(和你的Stock属性对应)
        Stocks = csv.GetRecords<Stock>().ToList();
    }
    
  • 路径问题:用Path.Combine结合AppDomain.CurrentDomain.BaseDirectory可以避免相对路径找不到文件的问题,确保程序能正确定位到App_Data下的CSV文件。

验证修改后的流程

  1. 实例化StockInfoViewModel时,构造函数会正确填充Stocks属性
  2. Controller将完整的ViewModel传递给视图
  3. 视图接收StockInfoViewModel类型的模型,遍历Model.Stocks不会再出现NullReferenceException

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:27:44