• Blazor入手教程(九)c#和js互相调用


    Blazor入手教程(九)c#js互相调用

    1,C#调用js代码

    C#调用js代码有两步

    1,razor页面顶部使用@inject注入所需要的类

    2,在代码中调用

     

     我们尝试在页面中写了一段js,然后vs告诉我们script标签不能出现在razor内部,可以把它放在入口的index.html文件中,或者单独建一个js文件,然后在index.html引入。

    我们把它移到在入口的index.html文件中,再次运行

     

     点击按钮,可以看到我们调用成功了,并且也获取到了参数

     

    2js调用c#静态方法

    Js调用c#静态方法也有两步

    1,声明一个C#静态方法,并标记上 [JSInvokable]的特性

    2,js中使用DotNet.invokeMethod DotNet.invokeMethodAsync调用

     

    DotNet.invokeMethod(“程序集名”,”方法名”,”参数...[多项,可空]”)

    调用带参数的方法

     

     

     

     

    调用带返回值的方法

     

     

    异步调用

    Js异步调用时返回值是一个promise,(js语言中处理异步的一种方式)。可以在回调then里面获取到返回值

     

     

    指定方法名的调用

    可以通过 [JSInvokable("新的方法名")]指定js调用的方法名

     

     

    这是在浏览器中运行的效果

     

    C#代码:

    @page "/invokejs"
    @inject IJSRuntime JsRuntime
    
    <h3>c#代码和js代码的互相调用</h3>
    
    
    
    <h3>c#调用JS</h3>
    <button @onclick="todo">Invoke</button>
    
    @code {
    
        public void todo()
        {
    
            var jsRunResult = JsRuntime.InvokeAsync<string>("demoMethods.runJs", "参数1", "参数2");
        }
    }
    
    <h3>JS调用C#</h3>
    
     
     
    <button onclick="demoMethods.jsInvokeC('参数1','参数2')">带参数调用</button>
    <button onclick="demoMethods.jsInvokeCWithReturn()">调用带返回值的</button>
    <button onclick="demoMethods.jsInvokeCAsync()">异步调用</button>
    <button onclick="demoMethods.jsInvokeCAlisa()">指定方法名调用</button>
    
    
    @code {
    
       
        //调用带参数方法
        [JSInvokable]
        public static void todo(object a1, object a2)
        {
    
            Console.WriteLine("js调用c#成功");
            Console.WriteLine("参数1" + a1.ToString());
            Console.WriteLine("参数2" + a2.ToString());
        }
    
    
    
        //带返回值的方法
        [JSInvokable]
        public static string todoWithReturn()
        {
    
            Console.WriteLine("todoWithReturn调用成功");
            return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
    
    
        //指定方法名
        [JSInvokable("todoThree")]
        public static void todoAlisa()
        {
    
            Console.WriteLine("todoAlisa调用成功");
    
        }
    }
    }

    js代码

     

       <script>
    
     
             
            window.demoMethods = {
                runJs: function (a1, a2) {
    
                    console.log("调用js成功")
                    console.log("参数1=" + a1);
                    console.log("参数2=" + a2);
                },
                jsInvokeC: function (a1, a2) {
                    //DotNet.invokeMethod 或 DotNet.invokeMethodAsync 
                    DotNet.invokeMethod("BlazorApp1", "todo", a1, a2);
                   
                },
               
                jsInvokeCWithReturn: function () {
                    //带返回值 
                    var r = DotNet.invokeMethod("BlazorApp1", "todoWithReturn" );
                    console.log("jsInvokeCWithReturn r=", r);
                },
    
                jsInvokeCAsync: function (a1, a2) {
                    //异步调用 
                    DotNet.invokeMethodAsync("BlazorApp1", "todoWithReturn").then(data => {
    
                        console.log("jsInvokeCAsync,data=",data);
                    });
                },
                jsInvokeCAlisa: function ( ) {
                    
                    //指定名称
                    DotNet.invokeMethod("BlazorApp1", "todoThree" );
                  
                },
    
            }
    
        </script>

     需要调用的c#代码可以写在任意的地方不仅仅是razor文件里面。

     

     

     

  • 相关阅读:
    webpack 3.X学习之CSS处理
    webpack 3.X学习之图片处理
    webpack 3.X学习之基本配置
    webpack 3.X学习之JS压缩与打包HTML文件
    webpack 3.X学习之初始构建
    【复习】VueJS之内部指令
    前端学习记录之Javascript-DOM
    javascript常用的Math对象的方法
    nodejs+mongoose+websocket搭建xxx聊天室
    Markdown常用语法
  • 原文地址:https://www.cnblogs.com/jimsfriend/p/14017077.html
Copyright © 2020-2023  润新知