【问题标题】:How to send from javascript to javascript .NET instance function in Blazor? (jsinterop, invokeMethodAsync, jsruntime)如何在 Blazor 中从 javascript 发送到 javascript .NET 实例函数? (jsinterop、invokeMethodAsync、jsruntime)
【发布时间】:2022-01-12 22:43:03
【问题描述】:

我有一些 javascript,我需要将值发送到通过 invokeMethodAsync 调用 .NET 函数的 javascript 函数

所以发送值的简单 javascript 代码类似于:

invokeJStoBlzr("sfsd");

那么JS函数...

window.invokeJStoBlzr(val) = (dotNetHelper) => {            
  dotNetHelper.invokeMethodAsync('JStoSrvCall', val);
};

但它似乎不喜欢 window.invokeJStoBlzr(val) 所以我认为这是语法问题。有人知道如何正确写吗?

Blazor 代码是

private DotNetObjectReference<Index> objRef;


public async Task startAsyc()    {   //called when client side makes selection
   await JsRuntime.InvokeAsync<string>("invokeJStoBlzr", objRef);
}

[JSInvokable]
protected static void JStoSrvCall(string value)
{
  //do whatever
}

我基本上需要将 javascript 值传递给该 invokeJStoBlzr 函数,然后在 JStoSrvCall 中接收该值

【问题讨论】:

    标签: .net blazor


    【解决方案1】:

    我基本上需要将 javascript 值传递给该 invokeJStoBlzr 函数,然后在 JStoSrvCall 中接收

    如果你想将值从 JavaScript 传递给 C#,那么你可以这样做:

    <button @onclick="() => StartAsyc()">Start</button>
    <h1>@JSMessage</h1>
    
    @code{
        private string JSMessage { get; set; }
    
        public async Task StartAsyc()
        {   //called when client side makes selection
            await JsRuntime.InvokeVoidAsync("invokeJStoBlzr", DotNetObjectReference.Create(this),
                "The Value You want to Send to JS");
        }
    
        [JSInvokable]
        public void JStoSrvCall(string value)
        {
            JSMessage = value;
            StateHasChanged();
        }
    }
    

    JavaScript 代码将如下所示:

    function invokeJStoBlzr(instance, val) {
        instance.invokeMethodAsync('JStoSrvCall', val);
    };
    

    【讨论】:

    • 好的,谢谢。为什么在 JSInvokable 中需要 StateHasChanged()?因为我猜它来自客户端?
    • 在上述情况下,不需要StateHasChanged(),因为在触发UI事件后会自动调用StateHasChanged()方法。
    • 另外,您在按钮 onclick 上启动,但我需要通过该 JS 函数启动....所以 javascript 将是 invokeJStoBlzr(objRef, "whatever");,但是如何/何时StartAsync 方法会被调用吗?
    • 你可以把 ``StartAsyc()` 放在OnAfterRenderAsync() 方法上。
    • 是的,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多