Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Blazor C#代码调用静态JavaScript方法_Javascript_C#_Interop_Blazor - Fatal编程技术网

如何从Blazor C#代码调用静态JavaScript方法

如何从Blazor C#代码调用静态JavaScript方法,javascript,c#,interop,blazor,Javascript,C#,Interop,Blazor,首先,我的JS: class MyClass { static myMethod() { alert("TEST"); } } 我的JS运行时是这样注入的: [Inject] protected IJSRuntime Js { get; set; } Js.InvokeVoidAsync("MyClass.myMethod"); 我想调用如下静态方法: [Inject] protected IJSRuntime Js { get; set; } Js.In

首先,我的JS:

class MyClass {
    static myMethod() {
        alert("TEST");
    }
}
我的JS运行时是这样注入的:

[Inject] protected IJSRuntime Js { get; set; }
Js.InvokeVoidAsync("MyClass.myMethod");
我想调用如下静态方法:

[Inject] protected IJSRuntime Js { get; set; }
Js.InvokeVoidAsync("MyClass.myMethod");
但我有一个错误:

Microsoft.JSInterop.JSException:在“窗口”中找不到“MyClass”


是否有一个合理的方法来解决这个问题,或者只通过将window.MyClass=MyClass添加到我的JS中?

是的,将您的方法注册到window对象是正确的

源代码的相关部分可在此处找到:

仔细观察,你会发现:

invokeJSFromDotNet: (identifier: string, argsJson: string) => { ... }
在哪里

@参数标识符标识要访问的全局可访问函数 调用

查看
findJSFunction
可以看到检查给定标识符是否已注册到窗口对象的部分,如果未注册,则会生成您看到的错误:

function findJSFunction(identifier: string): Function {

(...)

    let result: any = window;
    let resultIdentifier = 'window';
    let lastSegmentValue: any;
    identifier.split('.').forEach(segment => {
      if (segment in result) {
        lastSegmentValue = result;
        result = result[segment];
        resultIdentifier += '.' + segment;
      } else {
        throw new Error(`Could not find '${segment}' in '${resultIdentifier}'.`);
      }
    });
试试这个(假设服务器端Blazor)

在您的_Host.cshtml文件中:

(function () {
    window.MyClass = {
        myMethod: function () {
            return alert('TEST');
        }
    };
})();
在.razor文件中(顶部):

在.razor文件中的方法中:

await JSRuntime.InvokeAsync<string>(
            "MyClass.myMethod", null
            );
await JSRuntime.InvokeAsync(
“MyClass.myMethod”,null
);
见:

不,这是解决问题的方法。把它包装到生活中有什么好处?您仍然将MyClass注册到全局作用域中,所以封装是无用的,不是吗?嗯,类可以通过eval访问,如果使用正确,这并不是坏事。我制作了自己版本的“callstatic”和“createinstance”代码,我想知道是否有办法扩展JSInterop来使用这些方法。我的意思是我制作了一个扩展类,但它使用额外的JS来工作。