Razor Pages代码后置文件配置异常:@Model空引用错误排查
解决Razor Pages中@Model空引用错误
问题描述
刚接触Razor Pages,尝试用代码后置文件分离逻辑,在Index类的OnGet方法中初始化日期数据,但在.cshtml中调用@Model.date时出现「Object reference not set to an instance of an object.」错误,直接调用@Model.num也会触发同样错误,推测OnGet方法未执行,但不清楚原因。此前直接在Razor页面写代码可正常运行,改用代码后置后陷入瓶颈。
相关代码:
Razor页面代码
@page @model SportData.Web.Views.Home.Index <div class="date"> <h1>Aggiornamento lista in data @Model.date</h1> <!-- 错误发生位置 --> </div>
代码后置文件代码
using Microsoft.AspNetCore.Mvc.RazorPages; namespace SportData.Web.Views.Home { public class Index : PageModel { List<string> months = new List<string>(); public DateTime date { get; set; } public int num = 4; // 调用这个变量也会触发相同错误 public DateTime specificDate { get; set; } public void OnGet() { date = DateTime.Now; specificDate = new DateTime(2022, 08, 01); } } }
调试截图:
问题根源
你混淆了Razor Pages和MVC的文件结构:
- Razor Pages的页面和代码后置文件默认必须放在Pages目录下,框架会自动识别该目录下的PageModel并实例化。
- 你把文件放在了
Views/Home目录,这是MVC控制器视图的存放位置,Razor Pages框架不会处理这个位置的PageModel,导致页面的@Model始终为null,自然触发空引用错误。
解决方案
1. 调整文件结构
将Index.cshtml和Index.cshtml.cs移动到Pages/Home目录下(如果Home文件夹不存在,直接新建即可)。
2. 修正命名空间
修改代码后置文件的命名空间,与文件结构对应:
// 原命名空间:SportData.Web.Views.Home namespace SportData.Web.Pages.Home { // ... 其余代码不变 }
3. 修正Razor页面的@Model指令
更新.cshtml文件中的@Model引用,匹配新的命名空间:
@page @model SportData.Web.Pages.Home.Index <div class="date"> <h1>Aggiornamento lista in data @Model.date</h1> </div>
额外建议(遵循Razor Pages命名约定)
虽然不强制,但建议将代码后置类名改为IndexModel(页面名+Model),这是Razor Pages的标准命名规范,避免和其他类型冲突:
public class IndexModel : PageModel { // ... 其余代码不变 }
对应的Razor页面@Model也要改成:
@model SportData.Web.Pages.Home.IndexModel
完成以上调整后,重新编译运行,框架会正确实例化PageModel并执行OnGet方法,页面就能正常显示@Model中的数据了。
内容的提问来源于stack exchange,提问作者Matteo Pagliarello
相关产品推荐
相关产品推荐

