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 шт):
У вас есть 2 варианта: создание большого объекта или поэтапное(правильное). На хабре были статьи про UI и про ваш пример(большой объект) точно также рекомендовалось разбивать его на этапы. Не как вы предлагаете по статусам, категориям и.т.п, а разделите его на 2-3 смысловые части. На главной странице сперва загрузите все нужные вам данные, а затем передавайте их в ваши компоненты, например, через параметры [Parameter] и OnParametersSet/OnParametersSetAsync. Саму статью попробую найти.
В material есть такой компонент stepper. Для wpf библиотеки materialdesign есть расширяющая либа и в ней реализован данный компонент. Попробуйте, потестируйте его и можете сделать что-то похожее и удобное для пользователя.
Ну и немного не по теме:
- Почему в MAOrder, MAOrderPosition рядом с каждой сущностью есть ее id? Зачем нужен id, если его можно получить из Worker.Id, когда правильно настроены связи между сущностями? Например:
public ApplicationUser? Worker { get; set; }
public string? WorkerId { get; set; }