Blazor:如何通过 URL 将参数传递给 ViewModel(而不是 page/view)

Blazor: How to pass a parameter via URL to the ViewModel (not to the page/view)

我知道如何将参数从 url 传递到 blazor 页面,如下所示:

@page "/myPage/{myParameter}"

@if(myParameter != null && myParameter != "")
{
  <p>@myParameter</p>
}

@code{
  [Parameter]
  public string myParameter {get; set;};
}

如果我在浏览器中输入这样的内容:www.xyz.com/mypage/TEST 我可以在我的页面上显示 'TEST'。但是我怎样才能将参数直接传递给注入的 ViewModel?

这行不通 @page "/mypage/{ViewModel.myParameter}"。 ViewModel 通过 Startup.cs 注入并作为 services.AddScoped.

我有一个 'workaround':

@code {
    [Parameter]
    public string myParameter { get; set; }

    protected override void OnInitialized() //On Page Load
    {
        ViewModel.myParameter = myParameter;
    }
}

有没有正确的方法来做到这一点?感谢帮助(对 blazor 还是新手)

MyParameter由Router从Route中提取出来,作为SetParametersAsync中的Parameter传入页面组件。理论上,您可以为 myParameter 输入 setter。 不要 - 这绝对不是推荐的做法

此外,假设您在“/mypage/1”上导航到“/mypage/2”,OnInitialized 将不会被调用。您可能认为您在页面之间导航,但实际上,您只是在同一组件上调用 SetParametersAsync 并为 MyParameter.

设置新值

因此类似于:

    protected override void OnParametersSet() 
    {
        if (!ViewModel.myParameter.Equals(myParameter)) ViewModel.myParameter = myParameter;
    }

将确保它在更改时已设置,否则不会(我不知道 myParameter 上的 getters/setters 以及每次在 OnParametersSet 上设置的内容沉淀!) .