MAUI怎么从JavaScript调用C#代码 WebView与MAUI通信

来源:网站主作者:狼行天下头衔:草根站长
导读:本期聚焦于小伙伴创作的《MAUI怎么从JavaScript调用C#代码 WebView与MAUI通信》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MAUI怎么从JavaScript调用C#代码 WebView与MAUI通信》有用,将其分享出去将是对创作者最好的鼓励。

在MAUI跨平台应用开发中,WebView组件常用于展示网页内容,当网页需要调用原生C#实现的功能时,就需要建立JavaScript和C#的通信通道。这种通信方式可以让前端页面复用已有的Web逻辑,同时调用MAUI原生的系统能力,提升应用的整体功能丰富度。

MAUI怎么从JavaScript调用C#代码 WebView与MAUI通信

核心实现原理

MAUI的WebView组件提供了AddJavascriptInterface方法,可以将C#对象暴露给WebView中的JavaScript环境,JavaScript可以直接调用该对象上暴露的方法,实现从前端到原生的通信。整个过程不需要复杂的桥接逻辑,MAUI已经封装了底层的通信机制。

准备工作

首先需要在MAUI页面的XAML文件中添加WebView组件,设置好基础的布局属性,确保WebView可以正常加载网页内容。示例XAML代码如下:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiJsCallCSharpDemo.MainPage">
    <VerticalStackLayout>
        <WebView x:Name="MyWebView" 
                 HeightRequest="500"
                 WidthRequest="400"/>
    </VerticalStackLayout>
</ContentPage>

暴露C#方法给JavaScript

首先需要创建一个用于通信的C#类,这个类中的方法需要标记特定的特性,才能被JavaScript正确识别和调用。示例通信类代码如下:

using System;
using System.Threading.Tasks;

namespace MauiJsCallCSharpDemo
{
    // 标记JS可导出的特性
    [System.Runtime.InteropServices.JavaScriptExport]
    public class JsBridge
    {
        // 供JavaScript调用的无参方法
        public string GetDeviceInfo()
        {
            return "当前设备运行MAUI应用,系统版本为.NET 8";
        }

        // 供JavaScript调用的带参方法
        public int CalculateSum(int a, int b)
        {
            return a + b;
        }

        // 异步方法示例
        public async Task<string> GetDataAsync()
        {
            await Task.Delay(1000);
            return "异步获取的数据内容";
        }
    }
}

然后在页面的后台代码中,将创建的通信类实例注册到WebView的JavaScript环境中,同时加载测试用的网页内容:

using Microsoft.Maui.Controls;

namespace MauiJsCallCSharpDemo
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            InitWebView();
        }

        private void InitWebView()
        {
            // 创建通信桥实例
            var jsBridge = new JsBridge();
            // 将C#对象暴露给JavaScript,名称设置为jsBridge
            MyWebView.AddJavascriptInterface(jsBridge, "jsBridge");
            // 加载本地HTML测试页面
            MyWebView.Source = "test.html";
        }
    }
}

JavaScript调用C#方法

接下来需要准备测试用的HTML页面,页面中的JavaScript代码可以直接通过之前注册的jsBridge对象调用C#方法。示例HTML代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>JS调用C#测试</title>
</head>
<body>
    <h3>MAUI与JS通信测试</h3>
    <button onclick="callCSharpMethod()">调用C#无参方法</button>
    <button onclick="callCSharpWithParam()">调用C#带参方法</button>
    <button onclick="callCSharpAsync()">调用C#异步方法</button>
    <div id="result"></div>

    <script>
        // 调用无参C#方法
        function callCSharpMethod() {
            // 直接调用jsBridge上的GetDeviceInfo方法
            var result = jsBridge.getDeviceInfo();
            document.getElementById("result").innerText = "调用结果:" + result;
        }

        // 调用带参C#方法
        function callCSharpWithParam() {
            // 传递两个参数给C#方法
            var sum = jsBridge.calculateSum(10, 20);
            document.getElementById("result").innerText = "10+20的结果:" + sum;
        }

        // 调用异步C#方法
        async function callCSharpAsync() {
            // 异步方法调用需要处理Promise
            // MAUI会自动将C#的Task转换为JS的Promise
            var data = await jsBridge.getDataAsync();
            document.getElementById("result").innerText = "异步数据:" + data;
        }
    </script>
</body>
</html>

注意事项

  • C#中暴露给JavaScript的方法名在JS调用时会自动转为驼峰命名,比如C#的GetDeviceInfo在JS中调用为getDeviceInfo
  • 复杂参数传递时,建议将对象序列化为JSON字符串,C#端再反序列化处理,避免类型转换错误
  • 如果需要C#调用JavaScript方法,可以使用WebView的EvaluateJavaScriptAsync方法执行JS代码
  • 不同平台的WebView实现可能有细微差异,测试时需要覆盖Android、iOS、Windows等目标平台

常见问题排查

如果JavaScript调用C#方法没有反应,可以先检查以下几点:

确认AddJavascriptInterface方法是否在WebView加载页面之前调用,否则注册可能不生效。确认C#类和方法是否标记了正确的导出特性,确认JavaScript中调用的对象名和方法名是否和注册时一致。

通过以上步骤,就可以完整实现MAUI中从JavaScript调用C#代码的需求,满足WebView和原生逻辑的交互场景。

MAUIWebViewJavaScript调用C#_代码跨平台通信修改时间:2026-07-16 16:18:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。