Сохранить корпус в Blazor JSInterop?

У меня есть эти структуры данных, которые я отправляю между сервером ASP.NET Core и Javascript. Данные отправляются в виде сериализованного 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)
    ....
}

1 ответ

вы можете использовать [JsonPropertyName("PropName")]для каждого свойства примерно так:

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

это мешает ему передавать свойства camelCase в js.

причина, по которой это происходит: https://github.com/aspnet/Mvc/issues/4283

Другие вопросы по тегам