首页 > 解决方案 > Blazor 服务器端问题分享 javascript 代码

问题描述

我正在使用 Blazor 服务器端开发我的项目。在我开发时,我使用 javascript 代码来实现 C# 难以实现的东西。

但是,我面临着一些奇怪的情况。(我想这是javascript的问题)

假设有 2 个用户(A,B)。当“A”用户执行一些调用 javascript 代码的操作时,如果“B”用户进入同一页面,“A”用户的操作会影响“B”用户。

我用threejs实现了具有3d场景的网页。正如我上面解释的,当用户“A”使用鼠标事件(mousemove,mousedown..)移动某个对象时,如果用户“B”访问同一页面,则 B 的 3d 对象将移动到用户“A”移动的位置。最初,当用户访问我开发的网页时,3d 对象的位置应该是 0,0,0。

我猜

我猜javascript会有问题,但如果您有任何其他意见,请分享一下吗?

已编辑

我已经解决了这个问题DotNetObjectReference.Create(this);

C#

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        //send created instance to javascript
        var dotNetObjRef = DotNetObjectReference.Create(this);
        await JSRuntime.InvokeVoidAsync("SetObjectRef", dotNetObjRef);
    }
    await base.OnAfterRenderAsync(firstRender);
}

[JSInvokable]
public async Task enableSomething(bool bEnable)
{
   var something = bEnable;
}

//== before edit
//[JSInvokable]
//public static async Task enableSomethingStatic(bool bEnable)
//{   
//    var something = bEnable;
//}

Javascript

var objectRef;
function SetObjectRef(ref) {
    objectRef = ref;
}

//call c# function
objectRef.invokeMethodAsync("enableSomething", true);

正如我猜测的那样,这是“静态”方法的问题。如果您将从 javascript 调用的 C# 方法声明为“静态”并且此方法更改了 UI 变量的某些内容,则此方法可能会影响其他用户。

所以我创建当前页面的实例并将其发送给 javascript,当我需要从 javascript 调用 C# 方法时,我使用创建的实例调用方法。

有什么问题或问题,请分享。对不起,我的英语不好。

标签: javascriptasp.net-coreblazorblazor-server-side

解决方案


JavaScript 仅在客户端运行。我看不到两个窗口,更不用说两个用户,将如何共享数据。

几乎可以肯定,问题在于您正在注入一个单例服务——这意味着服务器将为所有用户使用一个实例。

如果是这样,您有两个选择:

(1) 为您的单例服务添加逻辑以合并用户。(例如,具有用户 ID/属性名称的字典作为键,一列作为值)

(2)Startup.cs将可疑单例服务更改为 .AddScoped(),这将为每个用户创建一个新实例。

目前,我认为后一种解决方案将立即解决您的问题。但是,不要低估 Singleton 的价值——它们对于其他事情会非常有用。


推荐阅读