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

.NET MAUI WebView如何通过JS回调获取异步函数返回数据?

在.NET MAUI WebView中实现JS异步回调结果传回原生应用

完全可行,MAUI WebView可以通过自定义JS桥接对象实现类似WebView2的消息收发能力,替代postMessage完成异步回调结果的传递。以下是具体实现步骤:


1. 修改前端JS代码,在异步回调中调用原生暴露的方法

你需要修改原有的getCards函数,让异步回调的结果直接调用MAUI端预先注册的桥接方法,而不是通过return返回:

function getCards(){
   MyLib.getCards(function(resp){
     // 调用MAUI端暴露的桥接方法传递结果,先转成JSON字符串避免类型问题
     if (window.mauiBridge && window.mauiBridge.sendCardsResult) {
       window.mauiBridge.sendCardsResult(JSON.stringify(resp));
     }
   });
} 

2. 在MAUI端注册JS桥接对象并处理回调结果

步骤2.1:定义桥接类

创建一个供JS调用的类,其中接收结果的方法必须标记[JSInvokable]特性:

// JS桥接类,负责接收前端传递的数据
public class JavascriptBridge
{
    // 定义事件,用于通知原生逻辑处理结果
    public event EventHandler<string> CardsReceived;

    // 供JS调用的方法,必须标记[JSInvokable]
    [JSInvokable]
    public void SendCardsResult(string cardsJson)
    {
        CardsReceived?.Invoke(this, cardsJson);
    }
}

// 示例:对应JS返回结果的实体类
public class Card
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 其他属性根据实际接口定义
}

步骤2.2:在页面中注册桥接并调用JS

在MAUI页面的后台代码中,将桥接对象绑定到WebView,并订阅结果事件:

public partial class MainPage : ContentPage
{
    private readonly JavascriptBridge _jsBridge;

    public MainPage()
    {
        InitializeComponent();
        _jsBridge = new JavascriptBridge();
        
        // 将桥接对象注册到WebView,前端可通过window.mauiBridge访问
        MyWebView.AddJavascriptBinding(_jsBridge, "mauiBridge");
        
        // 订阅卡片结果接收事件
        _jsBridge.CardsReceived += OnCardsReceived;
    }

    // 触发JS调用的示例按钮点击事件
    private async void GetCardsBtn_Clicked(object sender, EventArgs e)
    {
        await MyWebView.EvaluateJavaScriptAsync("getCards()");
    }

    // 处理从JS传回的卡片数据
    private void OnCardsReceived(object sender, string cardsJson)
    {
        // 解析JSON字符串为实体对象
        var cards = System.Text.Json.JsonSerializer.Deserialize<List<Card>>(cardsJson);
        
        // 后续业务逻辑处理...
    }
}

关键注意事项

  • 所有供JS调用的原生方法必须添加[JSInvokable]特性,否则无法被前端识别。
  • 传递复杂对象时,务必转成JSON字符串传递,避免跨平台的类型兼容性问题。
  • 确保WebView加载完成后再注册桥接对象(可在WebView.Navigated事件中执行注册逻辑)。
  • 该方案兼容MAUI支持的所有平台(Android、iOS、Windows、MacCatalyst)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:35:48