При передачи класса 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"/>

По итогу, сериализация и десериализация проходит как минимум два раза.


Ответы (0 шт):