Blazor как создавать объекты с большим количеством навигационных свойств?

Вопрос в следующем, есть такие модели: https://pastebin.com/HAVRWqUW
Как правильно создавать заказ (MAOrder) со стороны UI? Все остальные классы (Статус, категория и пр.) хранятся тоже в базе, соответственно их нужно доставать из базы тоже.
Пытался разбить каждый класс на отдельный компонент (в примере для статусов), чтобы можно было его встраивать в разметку страницы (создания и редактирования), но получилось как-то не очень:

@inject IOrderStatusesRepository repository

@if (statuses != null && statuses.Count > 0)
{
    <div class="form-floating mb-3">
        <select @bind="@SelectedId" class="form-select">
            <option value="" selected>-- Не выбран статус --</option>
            @foreach (var item in statuses)
            {
                <option value="@item.Id">@item.Name</option>
            }
        </select>
        <label class="form-label">Статус заказа</label>
    </div>
}
else if (statuses != null && statuses.Count == 0)
{
    <div class="alert alert-danger">Нет статусов для заказов</div>
}

@code {
    List<MAOrderStatus>? statuses;

    public int? SelectedId { get; set; }

    protected override async Task OnInitializedAsync()
    {
        statuses = await repository.GetAllAsync();
    }
}

Вопрос в том, как правильно и лучше сделать создание такого большого объекта? Можно ли сделать какое-то поэтапное создание заказа? Чтобы открывалась страница с выбором статуса, потом с выбором категории и пр., в конце создание позиций?
PS: .NET 6


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

Автор решения: Lapish

У вас есть 2 варианта: создание большого объекта или поэтапное(правильное). На хабре были статьи про UI и про ваш пример(большой объект) точно также рекомендовалось разбивать его на этапы. Не как вы предлагаете по статусам, категориям и.т.п, а разделите его на 2-3 смысловые части. На главной странице сперва загрузите все нужные вам данные, а затем передавайте их в ваши компоненты, например, через параметры [Parameter] и OnParametersSet/OnParametersSetAsync. Саму статью попробую найти.

В material есть такой компонент stepper. Для wpf библиотеки materialdesign есть расширяющая либа и в ней реализован данный компонент. Попробуйте, потестируйте его и можете сделать что-то похожее и удобное для пользователя.

Ну и немного не по теме:

  1. Почему в MAOrder, MAOrderPosition рядом с каждой сущностью есть ее id? Зачем нужен id, если его можно получить из Worker.Id, когда правильно настроены связи между сущностями? Например:
  public ApplicationUser? Worker { get; set; }
  public string? WorkerId { get; set; }
  1. Вам не нравятся бесплатные сторонние библиотеки компонентов? Их много. Я лично использую MudBlazor.
→ Ссылка