如何从Blazor C#代码调用静态JavaScript方法
首先,我的JS:如何从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
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来工作。