【问题标题】:Preserve casing in Blazor JSInterop?在 Blazor JSInterop 中保留大小写?
【发布时间】:2020-07-26 17:15:18
【问题描述】:

我有在 ASP.NET Core 服务器和 Javascript 之间发送的这些数据结构。 数据以使用 websocket 消息序列化的 JSON 格式发送。

在本例中,对象有一个名为Text(大写T)的参数

Server(C# object) --> System.Text...JsonSerialize --> WebSocket --> JSON.parse --> JS object

最终的 JS 对象:

{
  "Text": "Hello"
}

在引入 Blazor WebAssembly 之后,它使用 ClientWebSocket 直接与服务器对话

Server(C# object) --> System.Text...Serialize --> WebSocket --> System.Text...Deserialize --> C# object

问题,我的问题来自 JSInterop。

Blazor --> JSInterop --> JavaScript

最终的 JS 对象:

{
  "text": "Hello"
}

现在Text 属性的名称text 全部小写。

如何配置对象序列化以保留 C# 对象的大小写?

解决方法

当前的解决方法是在通过 JSInterop 传递对象之前对其进行序列化,然后运行 ​​JSON.parse 以取回对象。

C#

var jsonString = JsonSerializer.Serialize(arg)
JSRuntime.InvokeVoidAsync("MyFunction", jsonString);

JavaScript

window.MyFunction = function (jsonString) {
    var arg = JSON.parse(jsonString)
    ....
}

【问题讨论】:

  • 你能分享你的代码吗,不清楚你在问什么
  • @aguafrommars 问题是 C# 类的属性有大写字母,但是当它发送到 javascript 时,它是小写的。例如class MyClass { public string Hey {get; set;} } 将变成 { hey: '' }。字母大小写是Hey,但在js中变成hey。这就是你要问的 hultqvist 吗?
  • 这是 System.Text.Json 的默认行为:请参阅 github.com/dotnet/aspnetcore/issues/12685 - 当我们转换为 .NET Core 时,我在 WebAPI 输出方面遇到了类似问题 - 我将序列化程序改回 NewtonSoft。可能有一种方法可以在 Startup.cs 中设置它,但我不知道你的上下文
  • 我问的是外壳是正确的。我已经更新了问题。
  • @Quango 我正在使用 Blazor 客户端/webassembly。奇怪的是,我的解决方法也是使用System.Text.Json,并且保留了外壳。

标签: blazor blazor-client-side blazor-jsinterop


【解决方案1】:

您可以在每个属性上使用[JsonPropertyName("PropName")], 像这样:

public class ClientObj
{
    [JsonPropertyName("MyProp")]
    public int MyProp { get; set; }
}

这会阻止 atm 在 js 中提供 camelCase 属性。

发生这种情况的原因:https://github.com/aspnet/Mvc/issues/4283

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2011-03-30
    • 2010-12-20
    • 2020-10-04
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多