javascript - 从 Blazor 中由 Javascript DotNet.invokeMethodAsync 调用的静态方法调用 C# 非静态方法
问题描述
我知道我们可以通过调用 DotNet.invokeMethodAsync 方法从 JavaScript 更改 Blazor 中的 C# 属性值。我有以下工作,但在这个方法中我还想调用一个非静态方法。
JS 文件:
[script.js]
function ChangeContentJS() {
DotNet.invokeMethodAsync('InvokeFromJsApp', "ChangeParaContentValue", "New Content");
}
剃须刀页面:
[Index.razor]
@page "/"
@inject IJSRuntime JSRuntime
<h1>Change C# property value from JavaScript</h1>
<br />
<button @onclick='ButtonClickHandler'>Change Content - JS</button>
<br />
<p>@ParaContent</p>
@code {
public static string ParaContent = "Some Text Content";
public async Task ButtonClickHandler()
{
await JSRuntime.InvokeAsync<string>("ChangeContentJS");
}
[JSInvokable]
public static void ChangeParaContentValue(string value)
{
ParaContent = value;
RunNewCode(); //DOESNT WORK AS ITS A NON-STATIC METHOD
}
public void RunNewCode()
{
jsRuntime.InvokeVoidAsync("RunFunction");
}
}
我正在尝试在静态方法中运行非静态方法(在 BLAZOR 应用程序中)。我怎么能调用这个方法?
我试图使以下方法静态并得到以下错误:
public static void RunNewCode()
{
jsRuntime.InvokeVoidAsync("RunFunction");
}
CS0120:非静态字段、方法或属性“JSRuntime”需要对象引用
我如何使这个静态:@inject IJSRuntime JSRuntime
解决方案
这实际上在文档中有所描述
总结:为更新创建一个静态Action
并注册本地实例
private static Func<string, Task> ChangeParaContentActionAsync;
private async Task LocalChangeParaContentValueAsync(string value)
{
ParaContent = value;
await jsRuntime.InvokeVoidAsync("RunFunction");
}
protected override void OnInitialized()
{
base.OnInitialized();
ChangeParaContentActionAsync= LocalChangeParaContentValueAsync;
}
[JSInvokable]
public static async Task ChangeParaContentValue(string value)
{
await ChangeParaContentActionAsync.Invoke(value);
}
(未测试)
注意重要的是要记住,即使组件没有加载(即没有实例),您仍然可以调用 JSInvokable 方法。这可能会推断出未定义的行为!
编辑:更改为async Task
,由于异步InvokeVoidAsync
方法
推荐阅读
- javascript - 即使配置设置正确,React 代理也不起作用
- r - 在R中编写函数并得到错误:“}”中的意外'}'
- react-native - 如果不从数据/轴按下,胜利图表容器交互将不起作用
- python-3.x - 在多个远程服务器(Windows)之间传输文件的最佳方式
- python - 如何自动缩进下一行字符串
- node.js - Deno 脚本与 Node.js 兼容吗?
- c - 苹果实现的 printf
- javascript - JQuery 的 multiDatesPicker 不是函数
- javascript - Angular Material - 根据 ID 列分组和展开行
- python - 使用 Python 请求处理 Graphql 突变