
在 asp.net core razor 页面中,当尝试在 `@foreach` 中直接访问 `model_purchases.details` 时出现 cs0120 错误,根本原因是 razor 视图引擎将未限定的 `model_purchases` 误识别为类型名而非页面模型属性,导致编译器认为你在静态上下文中调用非静态成员。
该错误(CS0120: An object reference is required for the non-static field, method or property)通常出现在试图在静态上下文或未明确作用域中访问实例成员的场景。虽然 C# 编译器本身能清晰区分类型与实例属性,但 Razor 视图(.cshtml)在编译时会生成一个继承自 RazorPage
✅ 正确解决方案是显式使用 this. 限定符,强制 Razor 将其识别为当前页面实例的属性:
@foreach (var detail in this.Model_Purchases.Details)
{
}⚠️ 补充注意事项:
- 避免命名歧义:强烈建议将模型属性名与类型名区分开。例如,将 public Model_Purchases Model_Purchases { get; set; } 改为 public Model_Purchases PurchaseModel { get; set; },既提升可读性,也彻底规避 Razor 解析歧义。
- 确保模型已初始化:在 CreateModel.OnGet() 或构造函数中初始化 PurchaseModel = new Model_Purchases() 是必要的,否则 Details 为 null 会导致运行时 NullReferenceException(即使编译通过)。
-
无需额外声明 Details 属性:create.cshtml.cs 中的 [BindProperty] public List
Details { get; set; } 是冗余的,且可能干扰模型绑定。应删除该属性,仅保留 Model_Purchases 并依赖其内部 Details 集合。 - 验证数据绑定完整性:确保 Model_PurchasesDetails 类的属性具有正确的 [Required] 等数据注解,并在视图中使用 asp-for 绑定到 detail.Property,以支持客户端与服务端双重验证。
总结:CS0120 在 Razor 中多由“类型名与属性名同名”引发的解析歧义所致。使用 this. 显式限定是最直接有效的修复方式;长远来看,遵循清晰命名规范(如 PurchaseModel 而非 Model_Purchases)是预防此类问题的最佳实践。










