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

Blazor组件中如何将函数作为EventCallback变量传递

Blazor中通过RenderFragment传递EventCallback给嵌套组件的解决方案

你现在的问题出在直接在Razor标记里实例化MyNestedComponentOne时,没法正确绑定页面的EventCallback上下文。EventCallback得依赖组件的渲染上下文才能保证回调正常触发,不能直接在标记里用new赋值方法引用。

解决方案步骤

  • 不在Razor标记内直接new组件实例,而是在页面的@code块中初始化实例,并通过EventCallback.Factory.Create绑定当前页面的上下文。
  • 在Razor标记里直接引用初始化好的实例即可。

修改后的页面代码

Razor部分

@page "/"
@using BlazorAppPlayground.Client.Components

<MyComponentWithRenderFragments
    SomeDataForComponent="Hello World"
    NestedComponentOneInfo="@_nestedComponentOneInfo"> 
    <NestedComponentOneTemplate>
        <MyNestedComponentOne
            SomeDataForNestedOne="@context.SomeDataForNestedOne"
            Callback="@context.Callback">
        </MyNestedComponentOne>
    </NestedComponentOneTemplate>
</MyComponentWithRenderFragments>


<!-- 这段代码可以正常运行,作为参考 -->
<BlazorAppPlayground.Client.Components.MyNestedComponentOne
    SomeDataForNestedOne="@callbackText"
    Callback="DoAThing">
</BlazorAppPlayground.Client.Components.MyNestedComponentOne>

@Code部分

@code {
    private string callbackText = "Callback test";
    private MyNestedComponentOne _nestedComponentOneInfo;

    protected override void OnInitialized()
    {
        // 初始化实例并绑定带上下文的EventCallback
        _nestedComponentOneInfo = new MyNestedComponentOne
        {
            SomeDataForNestedOne = "Testing",
            Callback = EventCallback.Factory.Create<string>(this, DoAThing)
        };
    }

    private async Task DoAThing(string data)
    {
        callbackText = data;
        StateHasChanged(); // 显式触发UI更新,确保回调后页面能刷新
    }
}

说明

  • EventCallback.Factory.Create<string>(this, DoAThing)会把回调方法和当前页面组件的上下文绑定,确保子组件触发回调时能正确找到并执行DoAThing。
  • 你的MyComponentWithRenderFragments和MyNestedComponentOne组件代码无需修改,保持原样即可正常工作。

内容的提问来源于stack exchange,提问作者BrianH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:47:21