Blazor中@code属性离开函数后被重置为null的问题求助
问题解决:Blazor属性赋值后变为null
问题根源
你在CheeseItUp方法里声明了一个局部变量CheeseJson jsonTest,这个变量和类的公共属性同名,但作用域仅限于该方法内部。反序列化后的对象被赋值给了这个局部变量,类的jsonTest属性根本没被修改,所以方法执行完后,局部变量被销毁,类属性依然是初始的null。
修复方案
- 去掉局部变量的类型声明,直接赋值给类的属性,让反序列化结果真正存入类的公共属性中
- 用
using语句包裹StreamReader,确保文件流被正确释放,避免资源泄漏 - 将方法改为异步形式,配合Blazor组件生命周期的异步特性,避免阻塞UI
修改后的完整代码
@using System.Text.Json; @using System.Text.Json.Serialization; @using myFirstBlazorSite.Components.root.models; @page "/" @if (jsonTest != null) { <p>@jsonTest.Cheeses[0].Producer.Name</p> } else { <p>加载中...</p> } @code { private CheeseJson _jsonTest; public CheeseJson jsonTest { get { return _jsonTest; } set { _jsonTest = value; if (_jsonTest == null) { Console.WriteLine("Json was cleared"); } } } protected override async Task OnInitializedAsync() { await CheeseItUpAsync(); await base.OnInitializedAsync(); } private async Task CheeseItUpAsync() { string jsonFile = @"C:\Users\MacGuffin_\source\repos\myFirstBlazorSite\TestFiles\CheeseJson\Cheese1.json"; using var r = new StreamReader(jsonFile); string jsonString = await r.ReadToEndAsync(); jsonTest = JsonSerializer.Deserialize<CheeseJson>(jsonString); } }
额外说明
- 添加了
@if (jsonTest != null)的判断,避免组件初始化阶段因属性为null触发空引用异常 - 异步方法的写法更贴合Blazor的组件生命周期设计,提升页面响应性
内容的提问来源于stack exchange,提问作者MacGuffin_
相关产品推荐
相关产品推荐

