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文件。
验证修改后的流程
- 实例化
StockInfoViewModel时,构造函数会正确填充Stocks属性 - Controller将完整的ViewModel传递给视图
- 视图接收
StockInfoViewModel类型的模型,遍历Model.Stocks不会再出现NullReferenceException
内容的提问来源于stack exchange,提问作者UFOTurtle
相关产品推荐
相关产品推荐

