ASP.NET Core MVC项目Index.cshtml调用Model返回空异常且无数据如何解决
问题根因
- 视图未声明强类型Model:你的
Index.cshtml没有指定Model的类型,默认情况下Model会被初始化为null,不加判空就触发空引用异常。 - 空集合类型不匹配:你当前
foreach中??后使用的是Enumerable.Empty<string>(),而你的数据源是ProductInfo类型的集合,类型不匹配导致即使有数据也无法正常遍历渲染。 - 可能存在的EF Core映射问题:
DataContext中定义的DbSet<ProductInfo>名为Info,而Northwind数据库对应的商品表通常名为Products,如果没有手动指定表映射,EF Core会尝试查询不存在的Info表,导致返回空数据。 - 可能未正确注册数据库上下文:如果未在项目启动配置中注册
DataContext并配置正确的数据库连接字符串,会导致数据库查询失败返回null。
修复步骤
- 给视图添加强类型声明,在
Index.cshtml最顶部添加以下代码:
@model IEnumerable<Northwind_API.Models.ProductInfo>
- 修正foreach的判空逻辑,修改为匹配的类型:
@foreach (var item in Model ?? Enumerable.Empty<ProductInfo>())
- 修正EF Core的表映射,两种方式二选一:
- 方式一:修改
DataContext中的DbSet命名和表名匹配:
控制器查询代码同步修改为public DbSet<ProductInfo> Products { get; set; }return View(_context.Products.ToList());- 方式二:给
ProductInfo类添加表名特性指定映射的表:
[Table("Products")] // 替换为你实际的商品表名 public class ProductInfo { // 原有属性不变 } - 方式一:修改
- 确认启动配置中正确注册了数据库上下文,以.NET 6+的
Program.cs为例:
builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
同时确认appsettings.json中的DefaultConnection连接字符串配置正确,能够正常连接到你的数据库。
5. 控制器层添加空值防护,避免返回null给视图:
public IActionResult Index() { var productList = _context.Info?.ToList() ?? new List<ProductInfo>(); return View(productList); }
内容的提问来源于stack exchange,提问作者to_Bewilder
相关产品推荐
相关产品推荐

