You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中@code属性离开函数后被重置为null的问题求助

问题解决:Blazor属性赋值后变为null

问题根源

你在CheeseItUp方法里声明了一个局部变量CheeseJson jsonTest,这个变量和类的公共属性同名,但作用域仅限于该方法内部。反序列化后的对象被赋值给了这个局部变量,类的jsonTest属性根本没被修改,所以方法执行完后,局部变量被销毁,类属性依然是初始的null。

修复方案

  1. 去掉局部变量的类型声明,直接赋值给类的属性,让反序列化结果真正存入类的公共属性中
  2. 用using语句包裹StreamReader,确保文件流被正确释放,避免资源泄漏
  3. 将方法改为异步形式,配合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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:03:16