.NET 6 Blazor Server组件报错:变量在当前上下文不存在
问题原因与解决方案
你遇到的报错是因为在Blazor组件的类作用域中直接执行了赋值/操作语句,C#类的成员定义区域只能做声明、字段/属性初始化器,不能直接放置独立的执行代码(比如单独的ResourceList = new List<Resource>()或Add调用),这些代码必须放在构造函数、组件生命周期方法或者初始化器中。
以下是几种可行的修正方案:
方案1:属性声明时直接初始化+生命周期方法添加元素
这是Blazor组件中最常用的写法,利用属性初始化器创建列表实例,再在组件初始化生命周期方法中添加元素:
@using Models <div> <h2>Resources</h2> <table> <thead> <tr> <th>Name</th> <th>State</th> </tr> </thead> <tbody> @foreach (Resource resource in ResourceList) { <tr> <td>@resource.Name</td> <td>@resource.DisplayStatus</td> </tr> } </tbody> </table> </div> @code { // 直接在属性声明时初始化List实例 public List<Resource> ResourceList { get; set; } = new List<Resource>(); protected override void OnInitialized() { // 在组件初始化生命周期方法中添加元素 ResourceList.Add(new Resource()); } }
方案2:使用构造函数初始化
如果需要在组件实例化时就完成所有初始化逻辑,可以用构造函数:
@using Models <!-- 页面部分代码不变 --> <div> <h2>Resources</h2> <!-- ... 表格代码省略 ... --> </div> @code { public List<Resource> ResourceList { get; set; } // 构造函数中完成初始化和元素添加 public Resources() { ResourceList = new List<Resource>(); ResourceList.Add(new Resource()); } }
方案3:代码后置文件(Resources.razor.cs)写法
如果使用代码分离的方式,同样要遵循C#类语法规则,将初始化逻辑放在生命周期方法或构造函数中:
public partial class Resources { public List<Resource> ResourceList { get; set; } protected override void OnInitialized() { ResourceList = new List<Resource>(); ResourceList.Add(new Resource()); } }
核心说明
不管是List<Resource>还是string/int类型,所有变量的操作代码都不能直接写在类的顶级作用域中,必须放在方法(比如组件生命周期方法OnInitialized、OnParametersSet)或构造函数内,这是C#类的基础语法规则,和Blazor本身无关。
内容的提问来源于stack exchange,提问作者Jan Matějíček
相关产品推荐
相关产品推荐

