javascript - Blazor javascript 互操作 - 从 js 到 .NET 的对象转换
问题描述
我正在使用 Blazor javascript 互操作(对 .NET 的 js 调用),如
//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,即避免序列化/反序列化(并且没有反射)?
解决方案
为什么不直接接收 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 中的哪些字段对应。
推荐阅读
- google-bigquery - DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','-07:00'),'%Y-%m-%d %r') 的 Bigquery 标准 sql 函数
- c# - 在 wpf .netcoreapp 3.1 的 MahApps 中样式“找不到资源 'MetroButton”
- opencv - 如何将 RealSense2/OpenCV 源代码包含到 CMake 编译中?
- python - 简单的 python 网页抓取与登录
- spring-boot - Spring Batch 读取多个 csv 和 xls 文件
- pandas - Pandas:有效地用代表值替换分箱列
- c# - System.NotSupportedException ASP.net MVC
- c# - 比较两个日期时如何使用 DateTimePicker 说明月份的变化
- linux - GET 请求中的“复制为 cURL”包含 cookie 字段,而我没有登录到该站点
- python - 谁能向我解释以下代码有什么问题