При передачи класса Model в компонент Razor происходит ошибка JsonException (cycle)
Необходимо передать модель класса ModelA в Razor компонент.
@code {
[Parameter]
public ModelA Model { get; set; } = new ModelA();
}
Однако происходит ошибка JsonException, связанная с System.Text.Json.Serialization, которая говорит о возможном зацикливание:
JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles. Path:
Эта часть зацикливается:
System.Text.Json.Serialization.Metadata.JsonPropertyInfo<T>.GetMemberAndWriteJson(object obj, ref WriteStack state, Utf8JsonWriter writer)
System.Text.Json.Serialization.Converters.ObjectDefaultConverter<T>.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, ref WriteStack state)
System.Text.Json.Serialization.JsonConverter<T>.TryWrite(Utf8JsonWriter writer, ref T value, JsonSerializerOptions options, ref WriteStack state)
Класс ModelA
public class ModelA:
{
public int Id { get; set; }
public int ModelBId { get; set; }
public ModelB ModelB { get; set; }
}
Класс ModelB
public class ModelB:
{
public int Id { get; set; }
public List<ModelA> ModelAList { get; set; }
}
С помощью атрибута [JsonIgnore(Condition = JsonIgnoreCondition.Never)] пытался исправить эту проблему.
Класс ModelB с атрибутом
public class ModelB:
{
public int Id { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public List<ModelA> ModelAList { get; set; }
}
Это отлично работает (ошибок нет, данные не зацикливаются), если сам используешь System.Text.Json.Serialization, однако если попытаемся закинуть модель в компонент Razor, то ошибка с зацикливанием не пропадает. Компонент каким-то образом обходит атрибут.
Я пошел дальше, и нашел решения, связанные с:
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
// ...
});
(А так же AddMVC, AddControllers и т.д.)
Однако, и эти решения отлично работают только тогда, когда они не используются для передачи модели в компонент Razor.
Как можно избежать данной ошибки? Сейчас я использую костыль: я сам с помощью System.Text.Json произвожу сериализацию ModelA, а затем сразу же делаю десериализацию этой модели и закидываю в компонент Razor.
string ModelAJson = Serialization .. ModelA;
ModelA ModelANew = Deserialize .. ModelAJson;
<component type="typeof(ComponentModelA)" render-mode="ServerPrerendered" param-Model="ModelANew"/>
По итогу, сериализация и десериализация проходит как минимум два раза.