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
上设置的内容沉淀!) .
我知道如何将参数从 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
上设置的内容沉淀!) .