Blazor (на стороне сервера) передает параметр для просмотра модели

#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));
    }
}