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

Blazor Web App在.NET 8中从JavaScript调用.NET方法失败求助

.NET 8 Blazor Web App中JavaScript调用.NET方法的修正方案

针对你在.NET 8 Blazor Web App中遇到的JS调用.NET方法失败问题,结合.NET 8 Blazor交互模式的特性变化,对代码做以下关键修改即可解决:

1. 修正.NET端核心代码

@implements IDisposable
@inject IJSRuntime JS

<!-- 你的组件页面内容 -->

@code {
    private DotNetObjectReference<YourComponent>? _selfReference;
    // 替换YourComponent为你的实际组件类名

    protected override void OnInitialized()
    {
        // 提前初始化组件引用,替代方法内临时创建
        _selfReference = DotNetObjectReference.Create(this);
    }

    async Task Up()
    {
        await JS.InvokeVoidAsync("Crop.responses", _selfReference, Id);
        crop2View = "opacity-0"; // 修正原拼写错误:opcity -> opacity
    }

    [JSInvokable]
    // 将async void改为async Task,避免Blazor交互模式下的生命周期异常
    public async Task ResponseMethod(string data)
    {
        model.Base64 = data;
        await UploadServer();
        StateHasChanged();
    }

    // 实现IDisposable接口,释放组件引用防止内存泄漏
    public void Dispose()
    {
        _selfReference?.Dispose();
    }
}

2. 优化JavaScript代码(提升健壮性)

var base64data;

window.Crop = {        
    responses: async function (component, id) {
        try {
            // 用await替代嵌套then,代码逻辑更清晰
            const blob = await resize.result('blob');
            const reader = new FileReader();
            
            reader.readAsDataURL(blob);
            reader.onloadend = async function () {
                base64data = reader.result;
                const resultContainer = document.getElementById('result-' + id);
                const img = document.createElement('img');
                img.src = base64data;
                resultContainer.appendChild(img);
                
                // 等待.NET方法调用完成,避免未处理的Promise
                await component.invokeMethodAsync('ResponseMethod', base64data);
            };
        } catch (error) {
            console.error('图片处理或.NET方法调用失败:', error);
        }
    }
};

3. RenderMode配置注意事项

  • 若页面级设置@rendermode InteractiveServer引发错误,可改为仅在需要交互的组件上标注该指令,避免全局静态渲染与交互模式冲突。
  • 确保组件所在页面/布局未启用其他冲突的渲染模式(如StaticServer)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:26:10