#blazor #blazor-server-side
#blazor #blazor-на стороне сервера
Вопрос:
Я следил за отличной серией BlazorTrain Карла Франклина, и после просмотра эпизодов 24 и 25 я попытался применить подход MVVM в моем текущем проекте.
Проблема, с которой я столкнулся, связана со страницами, которые имеют параметр, как в
@page "/ViewTask/{Id}"
До преобразования в MVVM мой код в ViewTask был похож на
[Inject] protected NavigationManager NavigationManager { get; set; }
[Inject] protected IMyService MyService{ get; set; }
[Inject] protected IMyService2 MyService2{ get; set; }
[Inject] protected IMyService3 MyService3{ get; set; }
[Parameter] public string Id { get; set; }
В моей новой ViewModel я внедряю сервисы в конструктор, как показано ниже, однако идентификатор параметра равен нулю. Есть ли простой способ передать параметры в класс ViewModel? Я подумываю о том, чтобы сделать метод GetWorkTask() общедоступным и принять параметр Id и передать параметр таким образом, но хотел посмотреть, есть ли лучшие способы?
public class ViewTaskViewModel : IViewTaskViewModel
{
public ViewTaskViewModel(NavigationManager navigationManager,
IMyService myService,
IMyService2 myService2,
IMyService3 myService3)
{
NavigationManager = navigationManager;
MyService = myService;
MyService2 = myService;
MyService3 = myService3
InitializeViewModel().GetAwaiter().GetResult();
}
[Parameter] public string Id { get; set; }
private NavigationManager NavigationManager { get; set; }
private IMyService MyService { get; set; }
private IMyService2 MyService2 { get; set; }
private IMyService3 MyService3 { get; set; }
protected async Task InitializeViewModel()
{
...
GetWorkTask()
}
private void GetWorkTask()
{
int taskId = int.Parse(Id);
...
}
}
Ответ №1:
Это кажется разумным подходом. Иногда мы создаем метод InitializeViewModel(), который принимает любые параметры запуска, которые вы ему передаете. Вы также можете сделать Id обычным свойством ViewModel, а затем сделать что-то вроде этого:
@code
{
private string id = "";
[Parameter]
public string Id
{
get { return id; }
set { IndexViewModel.Id = value; }
}
}
Комментарии:
1. Спасибо, Карл. Действительно ценю ответ. Когда я создавал дополнительные ViewModels, я начал использовать метод PassParameters, который будет таким же, как ваш InitializeViewModel . Приятно слышать, что я не сбился с пути, и я буду иметь в виду альтернативный вариант, который вы упомянули.
Ответ №2:
В настоящее время я работаю с использованием следующего подхода
Добавляем ниже в нижнюю часть ViewTask.razor и, как уже упоминалось, меняем private void GetWorkTask() на public void GetWorkTask(int id) в ViewTaskViewModel и удаляем вызов из InitializeViewModel().
@code
{
[Parameter] public string Id { get; set; }
protected override void OnInitialized()
{
ViewModel.GetWorkTask(int.Parse(Id));
}
}