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 最佳实践:

  1. 避免属性名与类型名完全一致
    将 public Model_Purchases Model_Purchases { get; set; } 改为更具语义的名称,例如:

    [BindProperty]
    public Model_Purchases PurchaseModel { get; set; } // ✅ 清晰区分类型与实例

    对应

    视图中改为:

    @foreach (var detail in PurchaseModel.Details) { ... }
  2. 确保 OnGet() 初始化模型(你已做到)
    你已在构造函数中初始化 Model_Purchases = new Model_Purchases();,但建议将初始化移至 OnGet() 方法中,以保证每次请求都获得干净实例:

    public IActionResult OnGet()
    {
        PurchaseModel ??= new Model_Purchases(); // 或直接 new
        return Page();
    }
  3. 移除冗余绑定属性
    create.cshtml.cs 中的以下属性无需 [BindProperty] 且可能引发混淆:

    [BindProperty]
    public Model_PurchasesDetails Model_PurchasesDetails { get; set; } // ❌ 不需要单个Detail绑定
    [BindProperty]
    public List Details { 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主机快速搭建个人网站?