2

语境

我试图了解 JsInterop javascript 端的实现方式和位置。

在我的 Blazor Server 项目中给出以下示例代码:

public static ValueTask<string> Prompt(IJSRuntime jsRuntime, string message)
{
    // Implemented in exampleJsInterop.js
    return jsRuntime.InvokeAsync<string>(
    "exampleJsFunctions.showPrompt",
    message);
}

及其对应的javascript:

window.exampleJsFunctions = {
  showPrompt: function (message) {
    return prompt(message, 'Type anything here');
  }
};

(我确实了解SignalR 基础设施及其对电路概念的使用,我确实了解电路用于 Blazor 服务器项目中的两种客户端服务器通信。)

问题

该项目使用的唯一客户端脚本是:<script src="_framework/blazor.server.js"></script>据了解,所有 javascript 执行调度功能都应该在那里。我认为从服务器端完成 javascript 调用的唯一方法是一些 javascript eval() 功能。我试图找到源代码 _framework/blazor.server.js,我想它在 github 中,因为它在 /dist 文件夹中的构建输出包含文件 blazor.server.js

我试图在打字稿源中找到这部分(执行名称来自服务器的javascript函数),但没有成功。谁能指出我正确的方向?我是在找错地方了,还是没有 eval()?

*** 编辑:与此同时,我了解到不仅 eval() 在这里播放,实际上它是最后的机会,还有 the window["functionName"](arguments);too 及其变体。仍在寻找相关的源代码行...

4

2 回答 2

1

我试图了解 JsInterop javascript 端的实现方式和位置。

在应用程序主页中,通常_Host.cshtml(或 _index.cshtml 或wwwroot/index.html等,取决于您的服务器代码结构),位于标记中<head>的某处或末尾。<body>您可以在那里放置或立即在标签<script src="path/to/exampleJsFunctions.js"></script>内定义函数。<script>

仅供参考,该blazor.server.js脚本负责浏览器和服务器之间的 websocket 连接。当您Prompt(...)在应用程序中调用该方法时,服务器会要求浏览器(通过websocket)使用给定的 args运行一个名为exampleJsFunctions.showPromptdefined in的 js 函数。如果 js 函数在 中定义,浏览器将运行它(如果您使用浏览器开发工具在其上设置断点,它将被命中)。否则会抛出错误。没有。windowmessagewindoweval

(实际上,如何为浏览器定义函数并不重要。唯一重要的是,服务器要求浏览器调用该函数时,浏览器可以在对象下面找到该函数window。)

如果您如此热衷于查看源代码,您应该在jsinterop 源代码中找到它。

于 2020-08-03T05:03:24.923 回答
-1

您可以在 blazor.js 文件下添加自定义 JS 文件。您可以在其中声明您的函数,然后通过 JsRuntime 从 razor 组件中调用它。

我发现的最简单的方法是将 IJSRuntime 注入到组件中。

@inject IJSRuntime JSRuntime;
于 2020-05-13T05:25:22.890 回答