ASP.NET MVC视图显示为空,模型无数据如何解决?
问题
在ASP.NET MVC项目中从数据库读取数据并在视图展示时,调试发现模型为空。此前同类项目可正常运行,无法定位当前代码问题,求解决方法。
相关代码
实体类
namespace Persons.Data { public class Person { public int Id { get; get; } [Required] public string LastName { get; set; } [Required] public string FirstName { get; set; } } }
DbContext
namespace Persons.Data { public class ApplicationDbContext : DbContext { public ApplicationDbContext([NotNullAttribute] DbContextOptions options) : base(options) { } public DbSet<Person> Persons { get; set; } } }
控制器
namespace Persons.Controllers { public class PeopleController : Controller { private readonly ApplicationDbContext _context; public PeopleController(ApplicationDbContext context) { _context = context; } // GET: People public async Task<IActionResult> Index() { return View(await _context.Persons.ToListAsync()); } } }
视图
@model IEnumerable<Persons.Data.Person> @{ ViewData["Title"] = "Index"; } @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.LastName) </td> <td> @Html.DisplayFor(modelItem => item.FirstName) </td> </tr> }
排查与解决步骤
- 修正实体类主键配置:Person类的
Id属性写成了get; get;,这是明显错误,主键需要可设置,改为public int Id { get; set; }。EF Core依赖可写的主键属性映射数据库表,否则无法正确读取或写入数据。 - 检查数据库数据:确认目标数据库的
Persons表中是否存在记录,若本身无数据,模型自然为空。 - 验证DbContext注入配置:
- 在Program.cs(.NET 6+)或Startup.cs中,确认
ApplicationDbContext的注册代码正确,示例:builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - DbContext构造函数建议使用泛型的
DbContextOptions<ApplicationDbContext>而非非泛型的DbContextOptions,避免注入匹配错误:public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
- 在Program.cs(.NET 6+)或Startup.cs中,确认
- 调试控制器查询:在
Index方法中添加断点,查看await _context.Persons.ToListAsync()的返回结果,确认是查询未获取到数据,还是模型传递到视图时出现异常。 - 视图添加空值判断:为避免空引用异常,在视图中先判断模型是否为空再遍历:
@if (Model != null) { foreach (var item in Model) { // 原有遍历代码 } }
内容的提问来源于stack exchange,提问作者Csema
相关产品推荐
相关产品推荐

