【发布时间】:2021-06-15 10:17:22
【问题描述】:
我正在使用 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 新手..)
- Javascript在服务器端运行(共享资源??,如果这样,我该如何解决)
我猜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# 方法时,我使用创建的实例调用方法。
有什么问题或问题,请分享。 对不起我的英语不好。
【问题讨论】:
标签: javascript asp.net-core blazor blazor-server-side