C# CS0120 错误解析:在 Razor 视图中正确访问非静态模型属性
发布时间 - 2026-01-28 00:00:00 点击率:次本文详解 cs0120 编译错误的成因与解决方案,重点说明为何 `@foreach (var detail in model_purchases.details)` 在 razor 页面中报错,以及如何通过显式限定(`this.model_purchases.details`)或更优的模型绑定方式彻底规避该问题。
在 ASP.NET Core Razor Pages 开发中,CS0120: An object reference is required for the non-static field, method or property 是一个常见但易被误解的编译错误。它并非源于 C# 后端逻辑缺失字段声明(如 Model_Purchases.Details 已正确定义并初始化),而是Razor 视图引擎在解析表达式时发生了名称解析歧义。
问题根源:Razor 中的类型名与属性名冲突
在你的 Create.cshtml 中:
@foreach (var detail in Model_Purchases.Details)
Razor 编译器可能将 Model_Purchases 解析为类型名(Accounting8.Data.Model_Purchases),而非当前 PageModel 的实例属性 public Model_Purchases Model_Purchases { get; set; }。由于类型本身不能直接访问实例成员 .Details,编译器便抛出 CS0120 —— 它要求“对象引用”,即必须通过实例调用非静态成员。
⚠️ 注意:此行为是 Razor 特有的解析规则,并非 C# 语言本身的限制(在 .cs 文件中 Model_Purchases.Details 完全合法)。
解决方案一:显式使用 this. 限定(快速修复)
最直接的修复方式是在视图中明确指定这是当前 PageModel 的属性:
@foreach (var detail in this.Model_Purchases.Details)
{
}✅ this.Model_Purchases 明确告诉 Razor:这不是类型,而是当前页面模型(CreateModel 实例)的 Model_Purchases 属性。
解决方案二:优化模型设计与绑定(推荐长期实践)
虽然 this. 可解燃眉之急,但更健壮的做法是遵循 Razor Pages 最佳实践:
-
避免属性名与类型名完全一致
将 public Model_Purchases Model_Purchases { get; set; } 改为更具语义的名称,例如:[BindProperty] public Model_Purchases PurchaseModel { get; set; } // ✅ 清晰区分类型与实例对应
视图中改为:
@foreach (var detail in PurchaseModel.Details) { ... } -
确保 OnGet() 初始化模型(你已做到)
你已在构造函数中初始化 Model_Purchases = new Model_Purchases();,但建议将初始化移至 OnGet() 方法中,以保证每次请求都获得干净实例:public IActionResult OnGet() { PurchaseModel ??= new Model_Purchases(); // 或直接 new return Page(); } -
移除冗余绑定属性
create.cshtml.cs 中的以下属性无需 [BindProperty] 且可能引发混淆:[BindProperty] public Model_PurchasesDetails Model_PurchasesDetails { get; set; } // ❌ 不需要单个Detail绑定 [BindProperty] public ListDetails { get; set; } // ❌ 重复,由 PurchaseModel.Details 覆盖 应删除它们,专注维护单一数据入口 PurchaseModel。
补充:验证模型传递是否正确
确保 PageModel 正确传入视图,在 Create.cshtml 顶部添加显式模型声明(增强可读性与 IntelliSense):
@page
@model Accounting8.Pages.Purchases.Purchase_Requests.CreateModel
@{
ViewData["Title"] = "Create Purchase";
}并在视图中使用强类型访问:
@model CreateModel
...
@foreach (var detail in Model.PurchaseModel.Details) { ... }总结
- ✅ 根本原因:Razor 视图中 Model_Purchases 被误解析为类型而非实例属性。
- ✅ 立即修复:使用 this.Model_Purchases.Details 强制实例解析。
- ✅ 最佳实践:重命名属性(如 PurchaseModel)、移除冗余绑定、统一数据流。
- ✅ 预防措施:在 .cshtml 中始终通过 Model.Xxx 或 this.Xxx 显式限定,避免名称歧义。
遵循以上方法,不仅能解决 CS0120,更能提升代码可维护性与 Razor 模板的健壮性。
# html
# 后端
# ai
# c#
# 编译错误
# .net
# red
# Static
# Object
# for
# foreach
# 构造函数
# public
# Property
# var
# 对象
# this
# 绑定
# 而非
# 移除
# 是一个
# 这是
# 是在
# 燃眉之急
# 不需要
# 并在
# 这不是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何在万网开始建站?分步指南解析
如何快速搭建安全的FTP站点?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
香港服务器租用每月最低只需15元?
如何在云虚拟主机上快速搭建个人网站?
浅谈redis在项目中的应用
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何在IIS管理器中快速创建并配置网站?
教你用AI润色文章,让你的文字表达更专业
详解CentOS6.5 安装 MySQL5.1.71的方法
什么是javascript作用域_全局和局部作用域有什么区别?
利用vue写todolist单页应用
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel怎么实现模型属性的自动加密
Laravel中的Facade(门面)到底是什么原理
制作电商网页,电商供应链怎么做?
微信小程序 canvas开发实例及注意事项
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何注册花生壳免费域名并搭建个人网站?
Laravel如何处理异常和错误?(Handler示例)
网站建设整体流程解析,建站其实很容易!
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何在云主机快速搭建网站站点?
使用spring连接及操作mongodb3.0实例
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel如何实现数据库事务?(DB Facade示例)
如何用VPS主机快速搭建个人网站?


