【问题标题】:What type of object does DotNet.invokeMethod pass in c# method?DotNet.invokeMethod在c#方法中传递的是什么类型的对象?
【发布时间】:2019-05-02 15:52:18
【问题描述】:

我正在使用 Blazor(3.0.0-preview4) 并尝试通过 DotNet.invokeMethod 从 javascript 传递一个对象。我以这种方式进行了测试,它成功地传递了简单类型(字符串、int)。但是如果我传递 JS 对象,我会得到奇怪的对象类型 我可以把它写到Console.WriteLine,它看起来像JSON,但不是字符串。

所以我不能用这个做任何事情,我什至无法解析它,并且没有关于 Microsoft 的 SimpleJson 程序集的信息。我该如何处理这种类型?

提前致谢。

代码示例 布雷泽:

    [JSInvokable]
    public static void SetPlayerState(object[] args)
    {
        Console.WriteLine(args[0]);
        Console.WriteLine(args[0].GetType().Name);
    }

JS:

  window.cInvoke = (methodName, json) => {
    DotNet.invokeMethod("ui", methodName, JSON.parse(json));
  };

【问题讨论】:

    标签: javascript c# asp.net-core .net-core blazor


    【解决方案1】:

    DotNet.InvokeMethod 会将您在 WASM 控制台日志中看到的 JSON 字符串发送到 Blazor .razor 页面中的 JSInvokable 方法。

    要在 blazor 页面中反序列化它,请使用

    [JSInvokable]
    public static void SetPlayerState(string msg)
    {
        var deserialized = Microsoft.JSInterop.Json.Deserialize<myobject>(msg);
    }
    

    【讨论】:

    • 感谢您的回复,但它不是 JSON 字符串,因为 args[0].GetType().Name 返回的不是字符串,也不是对象。我通过JsonConvert.DeserializeObject&lt;PlayerState&gt;(args[0].ToString()) 使它工作(我使用 json.net 作为 json 库从微软无法转换类型,如 int -> uint 等)
    • 这是转换这种奇怪类型的唯一解决方法
    • JSON.parse 在你的 JS 中会从你的参数 "json" 字符串创建一个对象,如果它是一个 json 字符串 - 如果你想在 JSInvokable 中接收一个字符串,你应该只发送一个字符串。在发送到 JSInvokable 之前,您可以使用 JSON.stringify 将您的对象转换为字符串。至少你会知道你会收到一个字符串。
    • 是的,只是想减少(反)序列化的计数以提高性能。
    【解决方案2】:

    我发现 blazor 使用 this library

    感谢this answer
    Related issue

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多