Сохранить корпус в 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