Blazor JavaScript互操作-从JS到.NET的对象转换

时间:2019-05-31 03:33:53

标签: javascript .net json interop blazor

我正在使用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,即避免序列化/反序列化(并且没有反射)吗?

1 个答案:

答案 0 :(得分:0)

为什么不直接接收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中的哪些字段一起使用。