【问题标题】:Blazor javascript interop - object conversion from js to .NETBlazor javascript 互操作 - 从 js 到 .NET 的对象转换
【发布时间】:2019-05-31 03:33:52
【问题描述】:

我正在使用 Blazor javascript 互操作(js 调用 .NET),如

//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", jsObject);
---------------------------------------------------------
//C#
[JSInvokable]
public void DotNetMethod(object jsObject)
{
    Console.WriteLine($"jsObject type is {jsObject.GetType()}");
}

在浏览器控制台中,我得到:

'jsObject type is SimpleJson.JsonObject'

现在我想将 jsObject 转换为具体的 SimpleJson.JsonObject,如

[JSInvokable]
public void DotNetMethod(object jsObject)
{
    JsonObject jsObject = (JsonObject)jsObject; //error
}

但我使用 SimpleJson 的 C# 社区实现(如 https://github.com/facebook-csharp-sdk/simple-json)的所有试验都失败,抱怨演员阵容无效。

作为一种解决方法,我会遍历字符串:

//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", JSON.stringify(jsObject));
.
//C#
[JSInvokable]
public void DotNetMethod(string jsObjectJSON)
{
    JsonObject jsObject = SimpleJson.DeserializeObject<JsonObject>(jsObjectJSON);
}

有谁知道是否可以(以及如何)直接使用接收到的 jsObject,即避免序列化/反序列化(并且没有反射)?

【问题讨论】:

  • 通常 JSInterop 确实 要求您进行字符串序列化。事实上,您想以JsonObject 的形式与参数进行交互似乎意味着这正是您想要做的事情。所以我有点困惑,为什么您认为您的解决方法并不完全正确?
  • Blazor 提供 JS 互操作,包括隐式转换 CLI JSON。如果我知道该类型的类签名,我可以在两个世界之间传递实例,并且 blazor 会自动转换它们。当我看到从 js 到 C# 的对象类型是 JsonObject 时,我希望我可以依赖 Blazor 的内置功能并简单地转换为 JsonObject 而不是手动序列化/反序列化它,但显然 Blazor 寻找一个强类型的目标。换句话说,如果我想要像 JsonObject 这样的弱类型表示,我必须明确。不过问题不大。

标签: javascript .net json interop blazor


【解决方案1】:

为什么不直接接收JSON,为什么不接收之前定义的对象呢?

let x = {
    "data": "test",
    "moreData": "another test"
}

dotnetHelper.invokeMethodAsync('selectionChanged', x);

然后

//C#
public class InteropHelper
{
    public event Action OnSelectionChanged;

    [JSInvokable]
    public void selectionChanged(TestItem data)
    {
        OnSelectionChanged?.Invoke();
    }

    class TestItem
    {
        public string data { get; set; }
        public string moreData { get; set; }
    }
}

Blazor 会自动知道 JSON 中的哪些字段与 TestItem 中的哪些字段对应。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2020-07-15
    • 2020-08-09
    相关资源
    最近更新 更多